วิธีการนำ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
และ$2
args:
$ 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/
ซึ่งจะนำคำสั่งสุดท้ายและแทนที่ด้วยstring1
string2
ฉันนำapt-get up
ส่วนของคำสั่งกลับมาใช้ใหม่โดยใช้ลำดับของคีย์ต่อไปนี้:
Up ArrowBackspaceBackspaceBackspaceBackspace