ในขณะที่ a alias
เป็นวิธีหนึ่งในการทำสิ่งนี้สามารถทำได้ด้วยeval
เช่นกัน - เป็นเพียงการที่คุณไม่ต้องการeval
ดำเนินการคำสั่งมากเท่าที่คุณต้องการในeval
การประกาศคำสั่งประกาศ
ฉันชอบalias
es - ฉันใช้ 'em ตลอดเวลา แต่ฉันชอบฟังก์ชั่นที่ดีกว่า - โดยเฉพาะความสามารถในการจัดการพารามิเตอร์และพวกเขาไม่จำเป็นต้องขยายในตำแหน่งคำสั่งตามที่ต้องการสำหรับalias
es
ดังนั้นฉันคิดว่าบางทีคุณอาจต้องการลองนี้เช่นกัน:
_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
ชุดไป\n
ewline นานพอที่จะset ... "$*"
เข้ามา"$3"
,unset
s มันแล้วรีเซ็ตค่าของมันถ้ามันก่อนหน้านี้มีหนึ่ง
นี่คือตัวอย่างเล็ก ๆ น้อย ๆ :
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
'command -V time' \
'hash time' \
\) 'set +x'
คุณเห็นฉันใส่สองคำสั่งในค่าของ$TIME
ที่นั่น - หมายเลขใดดี - แม้ไม่มี - แต่ต้องแน่ใจว่ามันจะหนีออกมาและยกมาอย่างถูกต้อง - _time()
และเดียวกันจะไปสำหรับข้อโต้แย้งที่จะ พวกเขาทั้งหมดจะถูกรวมเข้าด้วยกันเป็นสตริงคำสั่งเดียวเมื่อพวกเขาถูกดำเนินการ - แต่แต่ละหาเรื่องได้รับ\n
ewline ของตัวเองและเพื่อให้พวกเขาสามารถแพร่กระจายออกได้อย่างง่ายดาย มิฉะนั้นคุณสามารถรวมมันทั้งหมดในที่เดียวหากคุณต้องการและแยกพวกมันออกเป็น\n
ewlines หรือ 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
อะไร