Bash auto สมบูรณ์สำหรับตัวแปรสภาพแวดล้อม [ปิด]


25

ดูเหมือนว่าคุณสมบัติการเติมข้อความอัตโนมัติของ bash จะไม่ทำงานกับตัวแปรสภาพแวดล้อมใน 11.04 พฤติกรรมปัจจุบันระบุไว้ด้านล่าง

export SCRIPT=/home/user/script
cd $SCRIPT/<tab>

ส่งผลให้มีเครื่องหมายแบ็กสแลช ( \) ถูกเพิ่มก่อน$SCRIPTเช่นจะมีข้อความแจ้ง

cd \$SCRIPT/

สิ่งเดียวกันจะเกิดขึ้นหากcdถูกแทนที่ด้วยlsหรือคำสั่งอื่น ๆ

นอกจากนี้หากมีไฟล์ปฏิบัติการในเส้นทางที่มีอยู่ใน $ SCRIPT และฉันต้องการเรียกใช้

$SCRIPT/<tab>

Bash ไม่แสดงตัวเลือกภายในโฟลเดอร์ (ไม่ว่าจะมีไฟล์เดียวหรือหลายไฟล์ / ไดเรกทอรีภายในเส้นทางที่มีอยู่ในตัวแปรสภาพแวดล้อม)

กล่าวอีกนัยหนึ่งการเติมข้อความอัตโนมัติไม่ทำงานกับตัวแปรสภาพแวดล้อม


2
นี่คือข้อผิดพลาดใน Launchpad
idbrii

ฉันคิดว่ามันไม่เกี่ยวกับ bash version (4.1 หรือ 4.2) ฉันเพิ่งติดตั้ง bash-4.1 จากแหล่งต่าง ๆ และใช้มันแทนรุ่น 4.2.24 (เวอร์ชันของ Ubuntu 12.04 ติดตั้งจากแหล่งที่มาดังนั้นฉันไม่จำเป็นต้อง 'หยุด' แพ็คเกจในการอัพเกรดแต่ละครั้ง) และพฤติกรรม เหมือนกันทุกประการ น่ารำคาญมาก ...

4
คำถามนี้ดูเหมือนจะเป็นหัวข้อนอกเรื่องเพราะเป็นเรื่องเกี่ยวกับบั๊กในรีลีสเก่าที่ไม่รองรับ ข้อผิดพลาดมีการอธิบายที่นี่และได้รับการแก้ไขใน 12.04 และต่อมา
วอร์เรนฮิลล์

1
@WarrenHill นี่อาจเป็นหัวข้อนอกเรื่องเพราะมันเกี่ยวกับบั๊ก (และฉันลงคะแนนให้ปิดเพราะเหตุผลนั้น) ข้อผิดพลาดนั้นอยู่ในรุ่นที่ไม่ได้รับการสนับสนุน แต่เราไม่ได้ปิดคำถามเก่าที่มีคำตอบเป็นหัวข้อนอกเมื่อวันที่ EoL ของรุ่นที่ได้รับผลกระทบมาพร้อมกัน เฉพาะคำถาม EoL ใหม่ / ไม่มีคำตอบนอกหัวข้อ
Eliah Kagan

คำตอบ:


13

ข้อผิดพลาดนี้ได้รับการแนะนำในทุบตี 4.2 มีด้ายยาวเกี่ยวกับที่นี่:

http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html

กล่าวโดยย่อ Chet Ramey ผู้พัฒนา bash ไม่แน่ใจว่าจะแก้ไขได้อย่างไร


มีวิธีในการแปลงกลับเป็น bash 4.1 หรือไม่
nilchat

1
การแก้ไขอยู่ในระหว่างทาง: Chet เพิ่ม "direxpand" shopt เพื่อเรียกคืนพฤติกรรมเก่า ยังไม่ได้อยู่ใน Oneiric
เนลสัน

8
ฉันประหลาดใจที่มีคนน้อยมากที่บ่นเกี่ยวกับเรื่องนี้ มันเป็นการเปลี่ยนแปลงครั้งใหญ่จากวิธีทุบตีทำงานเป็นเวลาหลายปี
Scott C Wilson

11

หากต้องการรับ behaivior เก่าให้ใช้คำสั่ง

shopt -s direxpand

หรือรวมไว้ในของคุณ .bashrc

หากคุณใช้. bashrc เดียวกันกับ bash เวอร์ชันอื่นให้ใช้

if ((BASH_VERSINFO[0] >= 4)) && ((BASH_VERSINFO[1] >= 2))
    then shopt -s direxpand
fi

1
การทดสอบนั้นจะล้มเหลวสำหรับ bash 5.0 และ 5.1
Keith Thompson

8

วิธีแก้ปัญหาที่แนะนำในhttp://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.htmlคือ:

  1. ใช้<Tab>เพื่อทำให้ตัวแปรสภาวะแวดล้อมของคุณสมบูรณ์โดยอัตโนมัติบรรทัดคำสั่งของคุณจะแจ้งcd $MYVAR
  2. กด<Esc>+ <Ctrl>-Eเพื่อขยายบรรทัดคำสั่งปัจจุบันเช่นแทนที่$MYVARด้วยค่าของมันเส้นทาง
  3. เพิ่ม a /จากนั้นเพลิดเพลินกับ<Tab>การเติมข้อความอัตโนมัติตามปกติ

สิ่งนี้ถือว่าคุณอยู่ในโหมด emacs ( set -o emacs) และได้bash_completionตั้งค่าอย่างสมเหตุสมผลสำหรับcd(เช่นcomplete -o nospace -F _cd cd)

น่าเสียดายที่นี่ใช้งานไม่ได้ในโหมด vi ( set -o vi) เนื่องจากการขยายบรรทัดคำสั่งไม่สามารถใช้งานได้


2

หลังจากพิมพ์ตัวแปรเชลล์

cd $SCRIPT/

พิมพ์ Cntrl-Alt-E สิ่งนี้จะขยายตัวแปร

cd /home/user/script/

สิ่งนี้ใช้ได้กับ EDITOR = vi ใน Fedora 16

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.