ฉันจะดูได้อย่างไรว่าคำสั่งใดทำงานในเชลล์ผ่านนามแฝงหรือฟังก์ชั่น


20

ฉันมีฟังก์ชั่นทุบตี (หรือนามแฝง) function install() {sudo apt-get install $@}ตัวอย่างเช่น เมื่อใช้คำสั่งสิ่งที่ผมคาดว่าจะจริงจะทำงานเป็นinstall dicelab sudo apt-get install dicelabฉันจะดูได้ว่าอะไรที่เชลล์ใช้งานจริง? ฉันต้องการตรวจสอบให้แน่ใจว่านามแฝงที่ซับซ้อนของฉันทำงานได้ตามที่คาดไว้


เป็น$@ส่วนหนึ่งของนามแฝงของคุณหรือไม่ จำไว้ว่านามแฝงไม่สนับสนุนการขัดแย้งที่จะขยายไปยังพารามิเตอร์ตำแหน่ง (ถ้ามี) ของบริบทที่เรียกนามแฝง วิธีการทำงานตามปกตินั้นsomealias some argsทำได้โดยการขยายนามแฝงและปล่อยให้อาร์กิวเมนต์เกิดขึ้น หากคุณต้องการเข้าถึงอาร์กิวเมนต์ให้ใช้ฟังก์ชั่นและเสนอราคา"$@"
ilkkachu


1
@ AlonAviv ดี :) ยังไงก็เถอะอย่างงกับการอ้างว่า"$@"ข้อโต้แย้งที่มีช่องว่างหรือตัวละครกลมจะเขียนเป็นอย่างอื่น
ilkkachu

1
@DarkHeart สิ่งนี้ไม่ซ้ำกัน คำถามอื่นไม่เกี่ยวข้องกับฟังก์ชั่นเชลล์
Kusalananda

2
ไม่เป็นแบบนี้จนกว่าจะได้รับการแก้ไขเพื่อเปลี่ยนหัวเรื่องทั้งหมด
Michael Homer

คำตอบ:


29

ใช้set -xในเปลือก

$ alias hello='echo hello world!'
$ hello
hello world!

$ set -x
$ hello
+ echo hello world!
hello world!

ใช้set -xเปลี่ยนในxtraceตัวเลือกเปลือก ( set +xจะปิด) และควรจะทำงานในทุกบอร์นเหมือนเปลือกหอยเช่นbash, dash ksh93, และpdksh zshสิ่งนี้จะแจ้งให้เชลล์เพื่อแสดงคำสั่งที่ได้รับการดำเนินการหลังจากการขยายนามแฝงและการขยายตัวแปร ฯลฯ ได้รับการดำเนินการ

เอาต์พุตจะอยู่ในสตรีมข้อผิดพลาดมาตรฐานของเชลล์ (เช่นเดียวกับพรอมต์สามัญ) ดังนั้นจะไม่รบกวนการเปลี่ยนทิศทางของเอาต์พุตมาตรฐานและจะถูกนำหน้าด้วยพรอมต์ตามที่กำหนดโดยPS4ตัวแปรเชลล์ ( +␣โดยค่าเริ่มต้น)

ตัวอย่างที่มีฟังก์ชั่นบางอย่าง:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }

$ helloworld
hello world!

$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

ฉันใช้กับset -xเชลล์แบบโต้ตอบทั้งหมดของฉันตามค่าเริ่มต้น ดีใจที่ได้เห็นสิ่งที่ถูกดำเนินการจริง ... แต่ฉันสังเกตเห็นว่าการแท็บที่ตั้งโปรแกรมเสร็จ ฯลฯ อาจทำให้เกิดร่องรอยการส่งออกที่ไม่ต้องการในบางเชลล์


14

คุณสามารถใช้shell-expand-lineซึ่งถูกผูกไว้กับ Control- Alt- eโดยค่าเริ่มต้น:

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line

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

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this

นี่เป็นคุณสมบัติที่ดี คุณรู้หรือไม่ว่า zsh มีคำสั่งที่เทียบเท่าshell-expand-lineหรือไม่
the_velour_fog

zshขออภัยที่ผมทำไม่ได้เพราะผมไม่ได้ใช้ แต่บางคนมีความคิดของตนเองขึ้นมา: wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-expand-alias.html
Arkadiusz Drabczyk


1

คุณสามารถใช้ bash builtin typeเพื่อดู alias หรือนิยามฟังก์ชันที่คุณต้องการรัน:

$ type ls
ls is aliased to `ls --color=auto -p'

$ type -a ls
ls is aliased to `ls --color=auto -p'
ls is /bin/ls

$ install() { sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.