วิธีการนำapt upส่วนของคำสั่งapt updateและapt upgradeคำสั่งไปใช้ซ้ำเพื่อรันทั้งสองคำสั่งตามลำดับในหนึ่งบรรทัดโดยไม่มีนามแฝง
apt up{date,grade}สิ่งที่ชอบ:
วิธีการนำapt upส่วนของคำสั่งapt updateและapt upgradeคำสั่งไปใช้ซ้ำเพื่อรันทั้งสองคำสั่งตามลำดับในหนึ่งบรรทัดโดยไม่มีนามแฝง
apt up{date,grade}สิ่งที่ชอบ:
คำตอบ:
วิธีง่ายๆ (และมีประสิทธิภาพมากขึ้น) ใช้สำหรับลูป (ในหนึ่งบรรทัด แต่ที่นี่จะแสดงในหลายบรรทัดเพื่อความชัดเจน):
for i in {date,grade}; do
apt up${i}
done
วิธีที่ชาญฉลาดคือการสร้างนามแฝง~/.bashrcสำหรับสองคำสั่งและลืมพิมพ์อีกครั้ง:
alias upgrade=' sudo apt update && sudo apt upgrade'
วิธีที่ซับซ้อนคือการทำสิ่งนี้:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
ดูว่าเกิดอะไรขึ้น เรากำลังสร้างสตริงข้อความที่ถูกต้องที่จะถูกเรียกใช้โดยเชลล์ ตอนนี้สิ่งที่คุณต้องทำคือการใช้แทนeval echoแต่evalโดยทั่วไปจะไม่แนะนำให้ใช้ในการเขียนสคริปต์เชลล์และคำสั่งนี้มีความซับซ้อนและไม่สามารถพกพาได้มากกว่า for loop เปลี่ยนแปลงในรูปแบบโดยไม่ต้อง EVAL (และสั้นที่สุดเพื่อให้ห่างไกล แต่ไม่ได้เกิดจากการที่มีประสิทธิภาพท่อและคำสั่งหลายechoสองapt, sudoและshอื่น ๆ จำนวนมากของฟอร์ก):
$ echo "apt "{update,upgrade}";"|sudo sh
นอกจากนี้เรายังสามารถใช้setเปลี่ยนลำดับที่ต้องการให้เป็นพารามิเตอร์ตำแหน่งและดำเนินการaptด้วย$1และ$2args:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
หรือมิฉะนั้นจะใช้สำหรับการวนซ้ำอีกครั้งเนื่องจากเป็นค่าเริ่มต้นในการประมวลผลพารามิเตอร์ตำแหน่งหากคุณไม่ได้ระบุลำดับใน for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
การใช้setเป็นเทคนิคที่พบบ่อยมากที่ฉันเห็นในหมู่มืออาชีพที่ทำงานกับหอยมากและด้วยเหตุผลที่ดี - มันเป็นแบบพกพามากและจะทำงานใน/bin/shที่ที่คุณไม่มีอาร์เรย์หรือ{a,b,c}การขยายตัว ดังนั้น POSIX-Ly set update upgrade ; for i; do echo apt $i ;doneวิธีแบบพกพาจะเป็น นอกจากนี้ควรมีประสิทธิภาพ
หรือเราสามารถไปที่whileเส้นทางวนรอบ:
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
แน่นอนว่าอย่าลืมรันโดยไม่มีechoการดำเนินการคำสั่งจริงเกิดขึ้น
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliasesได้เช่นกัน ~/.bashrcไฟล์นี้ควรจะมาโดยอัตโนมัติ
aptคำสั่ง) ที่มีการขัดแย้งแตกต่างกัน (ปรับปรุงและอัพเกรด) ดังนั้นฉันจะยังคงพูดห่วงเป็นวิธีที่จะไป
for i in date grade; do
upgrateชัดเจน
คุณยังสามารถใช้การขยายประวัติทุบตีเพื่อรับส่วนต่าง ๆ ของบรรทัดคำสั่งปัจจุบันและแก้ไข:
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!# เป็นบรรทัดปัจจุบัน:s/date/gradeเป็นตัวปรับแต่งที่ทดแทนdateด้วยgrade!#:s/dat/gradแทน
อีกตัวเลือกง่าย ๆ ที่ใช้xargsแทนfor:
echo up{dat,grad}e | xargs -n1 apt
ทดสอบ:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
อย่างไรก็ตามฉันต้องการชื่อแทนเชลล์เช่นเดียวกับ Sergiyเพราะวิธี "ง่าย" เหล่านี้ไม่ง่ายพอที่จะเป็นประโยชน์จริง ๆ
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%แม้ว่านี่จะค่อนข้างนานกว่า
printf '%s'คือการปฏิบัติที่ดีโดยทั่วไปเนื่องจากคุณไม่สามารถหนีมันเช่นกับหรือ--help -e
printf '%s\0'จะดีกว่านี้xargsได้มีธงให้จัดการกับวัตถุที่สิ้นสุดด้วย null
สร้างฟังก์ชั่นเช่นนี้:
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
repeat 'apt up' {date,grade}จากนั้นคุณสามารถเรียกใช้ สิ่งนี้มีประโยชน์ในการนำมาใช้ซ้ำสำหรับคำสั่งที่แตกต่างกันโดยสิ้นเชิงแม้ว่าจะไม่ได้ช่วยให้คุณพิมพ์คำสั่งนี้ได้
ฉันเห็นด้วยกับคำตอบอื่น ๆ ที่แน่นอนว่าสิ่งนี้อาจมีประโยชน์มากกว่า:
alias apt-up='apt update && apt upgrade'
@ คำตอบของ muru ทำให้ฉันอ่านเกี่ยวกับการขยายประวัติและฉันพบตัวแปรอื่น
$ sudo apt update
$ ^dat^grad^
^string1^string2^คือการเทียบเท่า!!:s/string1/string2/ซึ่งจะนำคำสั่งสุดท้ายและแทนที่ด้วยstring1string2
ฉันนำapt-get upส่วนของคำสั่งกลับมาใช้ใหม่โดยใช้ลำดับของคีย์ต่อไปนี้:
Up ArrowBackspaceBackspaceBackspaceBackspace