ในขณะที่ a aliasเป็นวิธีหนึ่งในการทำสิ่งนี้สามารถทำได้ด้วยevalเช่นกัน - เป็นเพียงการที่คุณไม่ต้องการevalดำเนินการคำสั่งมากเท่าที่คุณต้องการในevalการประกาศคำสั่งประกาศ
ฉันชอบaliases - ฉันใช้ 'em ตลอดเวลา แต่ฉันชอบฟังก์ชั่นที่ดีกว่า - โดยเฉพาะความสามารถในการจัดการพารามิเตอร์และพวกเขาไม่จำเป็นต้องขยายในตำแหน่งคำสั่งตามที่ต้องการสำหรับaliases
ดังนั้นฉันคิดว่าบางทีคุณอาจต้องการลองนี้เช่นกัน:
_time() if set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
'; then set -- "$1" "$2" "$*"; unset IFS
eval "$1 $TIME ${3#"$1"?"$2"?}"
fi
บิตส่วนใหญ่เกี่ยวกับ$IFS $*เป็นสิ่งสำคัญที่( subshell bit )เป็นผลมาจากการขยายตัวของเชลล์และเพื่อที่จะขยายข้อโต้แย้งลงในสตริงที่แยกวิเคราะห์ฉันใช้"$*" (ไม่eval "$@", โดยวิธีการเว้นแต่คุณจะแน่ใจว่าทุก args สามารถเข้าร่วมในช่องว่าง) . ตัวคั่นที่แยกระหว่าง args in "$*"เป็นไบต์แรกใน$IFSดังนั้นจึงอาจเป็นอันตรายต่อการดำเนินการโดยไม่ทำให้ค่าของมันแน่นอน ดังนั้นฟังก์ชั่นบันทึก$IFSชุดไป\newline นานพอที่จะset ... "$*"เข้ามา"$3",unset s มันแล้วรีเซ็ตค่าของมันถ้ามันก่อนหน้านี้มีหนึ่ง
นี่คือตัวอย่างเล็ก ๆ น้อย ๆ :
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
'command -V time' \
'hash time' \
\) 'set +x'
คุณเห็นฉันใส่สองคำสั่งในค่าของ$TIMEที่นั่น - หมายเลขใดดี - แม้ไม่มี - แต่ต้องแน่ใจว่ามันจะหนีออกมาและยกมาอย่างถูกต้อง - _time()และเดียวกันจะไปสำหรับข้อโต้แย้งที่จะ พวกเขาทั้งหมดจะถูกรวมเข้าด้วยกันเป็นสตริงคำสั่งเดียวเมื่อพวกเขาถูกดำเนินการ - แต่แต่ละหาเรื่องได้รับ\newline ของตัวเองและเพื่อให้พวกเขาสามารถแพร่กระจายออกได้อย่างง่ายดาย มิฉะนั้นคุณสามารถรวมมันทั้งหมดในที่เดียวหากคุณต้องการและแยกพวกมันออกเป็น\newlines หรือ semi-colons หรือ what-have-you เพียงแค่ให้แน่ใจว่าอาร์กิวเมนต์เดียวแสดงถึงคำสั่งที่คุณรู้สึกสบายที่จะใส่ในบรรทัดของมันเองในสคริปต์เมื่อคุณเรียกมัน ยกตัวอย่างเช่นจะปรับตราบเท่าที่มันจะตามมาด้วยในที่สุด\( \)โดยทั่วไปสิ่งปกติ
เมื่อevalได้รับตัวอย่างข้างต้นที่เลี้ยงมันดูเหมือนว่า:
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
และผลลัพธ์ดูเหมือน ...
เอาท์พุท
+++ echo any number of subshells
++ echo 'any number of subshells'
any number of subshells
++ command -V time
time is a shell keyword
++ hash time
bash: hash: time: not found
real 0m0.003s
user 0m0.000s
sys 0m0.000s
++ set +x
hashข้อผิดพลาดแสดงให้เห็นว่าผมไม่ได้มีการ/usr/bin/timeติดตั้ง(เพราะฉันทำไม่ได้)และcommandขอให้เราทราบว่าเวลาทำงาน การติดตามset +xเป็นคำสั่งอื่นที่ดำเนินการหลังจาก time (ซึ่งเป็นไปได้) - มันเป็นสิ่งสำคัญที่จะต้องระมัดระวังกับคำสั่งอินพุตเมื่อทำการevalอะไร