แสดงรายการคำสั่งทั้งหมดที่เชลล์รู้


32

ฉันจะพิมพ์อะไรที่เปลือกของฉัน (ซึ่งเกิดขึ้นbash) ที่จะแสดงรายการคำสั่งทั้งหมดที่ได้รับการยอมรับ?

นอกจากนี้สิ่งนี้แตกต่างกันตามเชลล์หรือไม่ หรือว่าเชลล์ทั้งหมดมีแค่ "ไดเรกทอรี" ของคำสั่งที่พวกมันรู้จัก?

ประการที่สองคำถามที่แตกต่างกัน แต่ฉันจะลบล้างคำถามเหล่านั้นได้อย่างไร ในคำอื่น ๆ วิธีการที่ฉันสามารถเขียนของตัวเองviewคำสั่งเพื่อแทนที่หนึ่งที่มีอยู่ในระบบ Ubuntu vimของฉันซึ่งดูเหมือนจะเป็นเพียงแค่โหลด


5
กรุณาอย่ารวมคำถาม โพสต์แต่ละคำถามเป็นคำถามแยกต่างหาก
terdon

ใกล้เคียงกันกับunix.stackexchange.com/q/63073/135943 (ฉันเชื่อมโยงทั้งสองทิศทาง)
Wildcard

คำตอบ:


61

คุณสามารถใช้ได้compgen

compgen -c # will list all the commands you could run.

FYI:

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

4
โปรดทราบว่าcompgen -cจะมีสิ่งต่าง ๆ เช่น{หรือwhileที่ไม่ใช่คำสั่งที่พูดอย่างเคร่งครัด
Stéphane Chazelas

13

เชลล์รู้คำสั่งสี่ชนิด

  • นามแฝง: เหล่านี้เป็นชื่อเล่นสำหรับคำสั่งที่มีตัวเลือกบางอย่าง พวกเขาถูกกำหนดไว้ในไฟล์เริ่มต้นของเชลล์ ( ~/.bashrcสำหรับทุบตี)
  • ฟังก์ชั่น: พวกเขาเป็นตัวอย่างของรหัสเปลือกให้ชื่อ เช่นเดียวกับนามแฝงพวกเขาจะถูกกำหนดในไฟล์เริ่มต้นของเชลล์
  • Builtins: เชลล์มาพร้อมกับคำสั่งในตัวจำนวนเล็กน้อย บิวอินส่วนใหญ่จัดการสถานะเชลล์ ( cdเปลี่ยนไดเรกทอรีปัจจุบันsetเปลี่ยนตัวเลือกและพารามิเตอร์ตำแหน่งexportเปลี่ยนแปลงสภาพแวดล้อม ... ) เชลล์ส่วนใหญ่เสนอบิวด์อินเดียวกันส่วนใหญ่ แต่เชลล์แต่ละตัวมีส่วนขยายบางอย่างสำหรับชุดพื้นฐาน
  • คำสั่งภายนอก: พวกเขาเป็นอิสระจากเปลือก เช่นเดียวกับโปรแกรมอื่น ๆ เชลล์เรียกใช้งานโปรแกรมภายนอกโดยค้นหาพวกมันในพา ธ การค้นหาที่เรียกใช้งานได้ PATHตัวแปรสภาพแวดล้อมประกอบด้วยรายการแยกลำไส้ใหญ่ของไดเรกทอรีที่จะค้นหาสำหรับโปรแกรม

ในกรณีที่มีคำสั่งหลายประเภทด้วยชื่อเดียวกันการจับคู่ครั้งแรกในลำดับข้างต้นจะถูกดำเนินการ¹

type some_nameคุณสามารถมองเห็นสิ่งที่ประเภทของคำสั่งชื่อสอดคล้องกับการทำงานโดย

คุณสามารถแสดงชื่อแทนโดยเรียกใช้aliasบิวด์อินโดยไม่มีอาร์กิวเมนต์ ไม่มีวิธีในการแสดงรายการฟังก์ชั่นหรือบิวด์อินที่ใช้งานได้ในทุกเชลล์ คุณสามารถค้นหารายการบิวอินในเอกสารของเชลล์

ในทุบตีsetbuiltin รายการฟังก์ชั่นที่มีคำจำกัดความของพวกเขาเช่นเดียวกับตัวแปร ใน bash, ksh หรือ zsh typeset -fแสดงรายการฟังก์ชันพร้อมคำจำกัดความ ในทุบตีคุณสามารถแสดงรายการชื่อคำสั่งทั้งหมดของชนิดใด ๆ compgen -cกับ คุณสามารถใช้compgen -A alias, compgen -A builtin compgen -A functionคำสั่งรายการประเภทที่เฉพาะเจาะจง คุณสามารถส่งสตริงเพิ่มเติมไปยังcompgenเพื่อแสดงรายการคำสั่งที่ขึ้นต้นด้วยคำนำหน้านั้นเท่านั้น

ใน zsh คุณสามารถแสดงรายการคำสั่งที่มีอยู่ในปัจจุบันจากประเภทให้กับecho ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}และecho ${(k)commands}(ว่าที่ผ่านมาหนึ่งรายการคำสั่งภายนอกเท่านั้น)

ตัวอย่างเชลล์แบบไม่เชื่อเรื่องพระเจ้าต่อไปนี้แสดงรายการโปรแกรมภายนอกทั้งหมดที่มี:

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

มีตัวพิมพ์ขอบใน Bash: คำสั่งที่แฮช

คู่มืออ้างอิง Bashบอกว่า:

การค้นหาไดเร็กทอรีแบบเต็มใน $ PATH จะดำเนินการเฉพาะเมื่อไม่พบคำสั่งในตารางแฮช

ลอง:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

PATHตัวแปรสภาพแวดล้อมไม่ได้มี~/dir-for-wat-command, compgen -cไม่แสดงแต่คุณสามารถเรียกใช้watwat

หากคุณต้องการเงาคำสั่งที่มีอยู่กำหนดนามแฝงหรือฟังก์ชั่น

¹ ข้อยกเว้น: บิวอินบางตัว (เรียกว่าบิวด์อินพิเศษ ) ไม่สามารถเงาด้วยฟังก์ชันได้ - bash และ zsh ไม่สอดคล้องกับ POSIX ที่จุดนั้นในโหมดเริ่มต้น


อีกกรณีหนึ่งคือขอบสำหรับค่า$PATHชอบ/bin:/usr/bin:(ต่อท้าย:) ซึ่งมันจะล้มเหลวในการแสดงรายการไฟล์ที่ปฏิบัติการในไดเรกทอรีปัจจุบัน
Stéphane Chazelas

3

รายการคำสั่งประกอบด้วยสองชุด:

  1. คำสั่งในตัวกับเชลล์
  2. คำสั่งใน PATH

คุณไม่สามารถเปลี่ยนแปลงตัว -ins แต่คุณสามารถเก็บเปลือกจากการใช้ในตัวโดยการระบุชื่อพา ธ /bin/echoเต็มเช่น

สำหรับคำสั่งในของPATHคุณคุณสามารถเปลี่ยนได้ PATHคือรายการไดเร็กทอรีที่คั่นด้วยโคลอนเพื่อค้นหาคำสั่งไฟล์ที่ตรงกันแรกที่พบ "wins"

export PATH=~/bin:${PATH}

(ไวยากรณ์นี้ใช้ไม่ได้กับcshเชลล์ที่รับ - ผ่าน แต่เป็นของอื่น ๆ ทั้งหมดที่ฉันรู้)

การส่งออกที่PATHมี~/binเป็นรายการแรกตามด้วยส่วนที่เหลือของPATHรายการที่มีอยู่ ดังนั้นตอนนี้เชลล์ของคุณจะตรวจสอบdirectory calledbin in your home directory for a command *first* before checking the standardPATH` ระบบที่ติดตั้ง คุณสามารถทำให้มันตรวจสอบไดเรกทอรีใหม่ล่าสุดโดยใช้แทน:

export PATH=${PATH}:~/bin

หากต้องการให้PATHยังคงมีอยู่สำหรับการเข้าสู่ระบบในอนาคตให้เพิ่มไปยัง.profileไฟล์ shell rc หรืออื่น ๆ



1

หากคุณกดปุ่ม tab สองครั้งแล้วกด y คุณจะได้รับรายการคำสั่งทั้งหมดที่มีอยู่ในเชลล์ปัจจุบันของคุณ สำหรับคำถามที่สองผมคิดว่าคุณควรใช้นามแฝง: เปลือกนามแฝง


เกี่ยวกับนามแฝงนั่นเป็นวิธีที่โง่เขลาในการเอาชนะและยกเลิกการแทนที่ (โดย "unaliasing") คำสั่งเมื่อมันถูกเรียกที่ใดก็ได้ในระบบ (เช่นจากเชลล์สคริปต์)?
themirror

1
คุณใช้เปลือกอะไร ฉันไม่สามารถรับแท็บสองรายการคำสั่งทั้งหมดในทุบตีของฉัน
terdon

ฉันใช้ bash บน Ubuntu 13.04 นอกจากนี้ยังมีคำสั่งที่เรียกว่า compgen ซึ่งสามารถใช้เพื่อรับรายการคำสั่งทั้งหมดที่มีใน bash
coffeMug

@terdon คุณติดตั้ง bash เสร็จแล้วหรือยัง?
coffeMug

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