สถานที่มาตรฐานสำหรับสคริปต์ bash_completion.d ที่ผู้ใช้กำหนด?


47

ฉันมีการเข้าถึงของผู้ใช้ (ไม่มีรูท) ในเครื่อง Linux (Suse) ที่ฉันพัฒนาสคริปต์ทุบตีและกฎการเติมข้อความอัตโนมัติของ bash ที่เกี่ยวข้อง

เนื่องจากสคริปต์เป็นของผู้ใช้ของฉันเท่านั้นดังนั้นฉันจึงต้องการกฎที่สมบูรณ์เท่านั้น "ใช้งานได้" สำหรับฉัน (ส่วนหนึ่งจากความจริงที่ว่าฉันไม่มีการเขียนรูท) การวางสคริปต์ bash_completion ลงใน/etc/bash_completion.d/โฟลเดอร์จึงไม่ใช่ตัวเลือก

ในขณะนี้ฉันตั้งชื่อไฟล์.bash_completion.myscriptและแหล่งที่มาของฉันโดยตรงจากฉัน.bashrcแต่ฉันสงสัยว่ามีวิธี "มาตรฐาน" อื่น ๆ ของการบรรลุผลเหล่านี้พิจารณาแล้วในการดำเนินการทุบตี

ตัวอย่างเช่นการสร้างโฟลเดอร์/home/myuser/.bash_completion.d/?

คำตอบ:


36

ใช้~/.bash_completionไฟล์

จากคำถามที่พบบ่อยเกี่ยวกับBash Complete :

ถาม: ฉันจะแทรกความสำเร็จในพื้นที่ของฉันเองได้อย่างไรโดยไม่ต้อง
แทรกเข้าไปใหม่ทุกครั้งที่คุณออกรุ่นใหม่

A. ใส่ไว้ใน ~ / .bash_completion ซึ่งจะถูกแยกวิเคราะห์ในตอนท้ายของ
สคริปต์เสร็จสิ้นหลัก ดูคำถามต่อไป

ถาม: ฉันเป็นผู้เขียน / ดูแลแพ็คเกจ X และต้องการรักษา
รหัสความสมบูรณ์ของตัวเองสำหรับแพ็คเกจนี้ ฉันควรใส่มันไว้ที่ไหนเพื่อให้แน่ใจ
ว่าเชลล์ bash แบบโต้ตอบจะค้นหามันและหามาได้?

A. ติดตั้งในหนึ่งในไดเรกทอรีที่ชี้โดย
ตัวแปรไฟล์ pkgconfig ของ bash-completion มีสอง
ทางเลือก: ทางเลือกที่แนะนำคือ 'completionsdir' (รับด้วย
"pkg-config --variable = completionsdir bash-completion") ซึ่งการ
เติมเต็มจะเสร็จสมบูรณ์ตามความต้องการตามชื่อคำสั่งที่เรียกใช้
ดังนั้นโปรดตั้งชื่อของคุณ ไฟล์เสร็จสมบูรณ์ตามและรวมถึง
การเชื่อมโยงตัวอย่างสัญลักษณ์ในกรณีที่ไฟล์มีความสมบูรณ์
มากกว่าหนึ่งคำสั่ง อีกอันหนึ่งที่มีอยู่สำหรับ
เหตุผลด้านความเข้ากันได้แบบย้อนหลังคือ 'compatdir' (รับด้วย
"pkg-config --variable = compatdir bash-completion"


ฉัน googled และค้นหาข้อมูลจำนวนมากภายใน serverfault ก่อนถาม แต่ไม่ได้คิดถึงขั้นตอนพื้นฐานที่สุด: RTFM! ขอบคุณมากสำหรับคำตอบ!
Carles Sala

4
อาจต้องการระบุว่า.bash_completionเป็นไฟล์และไม่ใช่ไดเรกทอรี เนื่องจากbash_completion.dเป็นไดเรกทอรีที่ฉันคิดว่าฉันสามารถทำได้เฉพาะที่scpของฉันbash_completion.dและเปลี่ยนชื่อบนเซิร์ฟเวอร์ระยะไกล แต่ในการเข้าสู่ระบบครั้งต่อไปมันบอกฉันว่ามันต้องเป็นไฟล์
NobleUplift

3
@NobleUplift คำถามที่พบบ่อยเกี่ยวกับการสร้าง Bash เสร็จสมบูรณ์มีการเปลี่ยนแปลงและขณะนี้มีข้อมูลเกี่ยวกับวิธีการโหลด Bash completions ของผู้ใช้จากไดเรกทอรีตามต้องการ สิ่งนี้ดูเหมือนว่าจะทำงานได้โดย bash-completion เวอร์ชัน 2.8 เป็นอย่างน้อย แต่ไม่ใช่ 2.1 ไฟล์ในไดเรกทอรีควรตั้งชื่อให้ตรงกับคำสั่งที่ใช้หรือลิงก์สัญลักษณ์สามารถใช้เพื่อวัตถุประสงค์นั้นได้
jarno

@ jarno ฉันเขียนสคริปต์เสร็จ bash สำหรับทุกโปรแกรมที่กำหนดเองและสคริปต์ในระบบของเรา แต่นักพัฒนาอาวุโสของฉันยิงพวกเขาลง :(
NobleUplift

@NobleUplift ทำไม คุณสามารถใช้มันเพื่อตัวคุณเองได้
jarno

49

นี่คือวิธีที่ผู้ใช้โลคัลสามารถมี~/.bash_completion.d/ไดเร็กทอรีที่ใช้งานได้

  1. แก้ไขไฟล์: nano ~/.bash_completion, เพิ่มสิ่งต่อไปนี้:

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
  2. ทำไดเรกทอรี: mkdir ~/.bash_completion.d

  3. แก้ไขไฟล์: ~/.bash_completion.d/myscript, เพิ่มสิ่งต่อไปนี้:

    _myscript_tab_complete () {
        local cur prev opts
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        words="-f -h --etc"
    
        COMPREPLY=( $(compgen -W "${words}" -- ${cur}) )
        return 0
    }
    complete -F _myscript_tab_complete myscript
  4. แหล่งที่มา. bash_completion: . ~/.bash_completion

ปรับปรุง

หากคุณคาดว่าจะมีที่ว่างเปล่า~/.bash_completion.d/ไดเรกทอรีและต้องการที่จะหลีกเลี่ยงการได้รับข้อความแสดงข้อผิดพลาดเพิ่มการทดสอบประเภทของไฟล์ที่มีbash: /home/<username>/.bash_completion.d/*: No such file or directory[ -f "$bcfile" ]

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done

2

คำตอบโดยรัสเซล E Glaueเป็นที่ดี แต่~/.bash_completionไม่สมบูรณ์

ปัญหาคือเมื่อ~/.bash_completion.d/ว่างเปล่าและfor f in ~/.bash_completion.d/*พิมพ์ข้อความแสดงข้อผิดพลาดต่อไปนี้:

-bash: /home/user/.bash_completion.d/*: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

วิธีแก้ปัญหาแบบพกพาที่ง่ายที่สุดคือการข้ามลูปหากไดเรกทอรีว่าง:

if [[ -d ~/.bash_completion.d/ ]] && \
   ! find ~/.bash_completion.d/. ! -name . -prune -exec false {} +
then
    for f in ~/.bash_completion.d/*
    do
        source "$f"
    done
fi

1

วิธีที่ง่ายกว่าคือใช้ตัวเลือก nullglob ขณะนี้ไม่สามารถพกพาได้ แต่ไม่สำเร็จอย่างทุบตี ดังนั้นการพกพาจึงไม่สำคัญ

นอกจากนี้คุณจะต้องใช้เครื่องหมายคำพูดรอบตัวแปรเมื่อทำการจัดหา กรณีนี้จะจัดการกับกรณีที่ไฟล์มีช่องว่างอักขระพิเศษอื่น ๆ

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done

1
FYI คำอธิบายของ (หรือลิงก์ไปยังเอกสาร) เกี่ยวกับสิ่งที่แสดง (เช่นnullglob) เป็นประโยชน์ต่อผู้อ่าน
Cometsong

1

อย่างน้อย bash-completion 2.8 และรุ่นใหม่กว่าเปิดใช้งานตัวเลือกเพื่อวาง Bash completeions ในไดเรกทอรี

${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions

ชื่อไฟล์ที่สมบูรณ์หรือชื่อลิงค์สัญลักษณ์จะต้องตรงกับชื่อคำสั่งที่เกี่ยวข้อง ความสำเร็จเหล่านี้ถูกโหลดตามความต้องการเท่านั้น ความสำเร็จที่เก็บไว้ในไฟล์ ~/.bash_completionจะถูกโหลดเสมอ

การอ้างอิง: โปรดดู "Q. ฉันควรติดตั้งความสำเร็จในท้องถิ่นของฉันที่ไหน?" ในhttps://github.com/scop/bash-completion/blob/master/README.md

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