นำส่วน 'apt up' มาใช้ใหม่ของคำสั่ง 'apt update' และ `apt upgrade` เพื่อเรียกใช้ทั้งสองอย่างเป็นลำดับในหนึ่งบรรทัด


11

วิธีการนำapt upส่วนของคำสั่งapt updateและapt upgradeคำสั่งไปใช้ซ้ำเพื่อรันทั้งสองคำสั่งตามลำดับในหนึ่งบรรทัดโดยไม่มีนามแฝง

apt up{date,grade}สิ่งที่ชอบ:


อะไรคือเป้าหมายของการบรรลุเป้าหมายนี้? เหตุใดสิ่งนี้จึงน่าสนใจ / เกี่ยวข้อง
วานาเดียม

25
@vanadium เราเป็นผู้ใช้ลินุกซ์พยายามทำสิ่งที่ไม่มีจุดหมายช่วยให้เราสามารถเรียนรู้เทคนิคที่สามารถนำมาประยุกต์ใช้ในภายหลังเพื่อสิ่งที่ซับซ้อนมากขึ้นถ้าไม่มีเราเคยทำของให้ที่จะไม่มีความซื่อสัตย์ของเราจะอยู่ที่นี่
คาร์เรน H

1
@ DarrenH นั่นคือสิ่งที่ฉันคิดว่าจริง ๆ :-)
vanadium

คำตอบ:


19

วิธีง่ายๆ (และมีประสิทธิภาพมากขึ้น) ใช้สำหรับลูป (ในหนึ่งบรรทัด แต่ที่นี่จะแสดงในหลายบรรทัดเพื่อความชัดเจน):

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การดำเนินการคำสั่งจริงเกิดขึ้น


7
เพียงแค่ทำการวนรอบในหนึ่งบรรทัด for i in {date,grade}; do sudo apt up${i}; done
Videonauth

3
หากคุณต้องการให้ไฟล์ของคุณเป็นระเบียบเรียบร้อยคุณสามารถใส่ชื่อแทน~/.bash_aliasesได้เช่นกัน ~/.bashrcไฟล์นี้ควรจะมาโดยอัตโนมัติ
francescop21

2
ฉันได้อัปเดตคำตอบของฉันด้วยสิ่งที่คุณต้องการ มันเป็นหนึ่งซับ แต่ฉันไม่คิดว่ามันจะทำให้ง่ายขึ้น ตรงไปตรงมามีจุดในการทำเช่นนี้เมื่อคุณต้องการที่จะเรียกใช้คำสั่งที่สอง (yes, ที่สองไม่มีaptคำสั่ง) ที่มีการขัดแย้งแตกต่างกัน (ปรับปรุงและอัพเกรด) ดังนั้นฉันจะยังคงพูดห่วงเป็นวิธีที่จะไป
Sergiy Kolodyazhnyy

1
ไม่จำเป็นต้องมีการขยายสตริงในสำหรับส่วนหัวของวงแค่ตั้งชื่อการวนซ้ำ:for i in date grade; do
rexkogitans

5
นามแฝงดังกล่าวควรมีชื่อupgrateชัดเจน
ท่อ

14

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

$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
  • !# เป็นบรรทัดปัจจุบัน
  • :s/date/gradeเป็นตัวปรับแต่งที่ทดแทนdateด้วยgrade

6
คุณสามารถบันทึกอักขระได้อีก 2 ตัวโดยใช้!#:s/dat/gradแทน
ด่าน

9

อีกตัวเลือกง่าย ๆ ที่ใช้xargsแทนfor:

echo up{dat,grad}e | xargs -n1 apt

ทดสอบ:

$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade

อย่างไรก็ตามฉันต้องการชื่อแทนเชลล์เช่นเดียวกับ Sergiyเพราะวิธี "ง่าย" เหล่านี้ไม่ง่ายพอที่จะเป็นประโยชน์จริง ๆ


1
ดีมาก. ความแตกต่างของชุดรูปแบบอาจเป็นไปได้printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%แม้ว่านี่จะค่อนข้างนานกว่า
Sergiy Kolodyazhnyy

printf '%s'คือการปฏิบัติที่ดีโดยทั่วไปเนื่องจากคุณไม่สามารถหนีมันเช่นกับหรือ--help -e
yyny

@YoYoYonnY ใช่ บางทีอาจprintf '%s\0'จะดีกว่านี้xargsได้มีธงให้จัดการกับวัตถุที่สิ้นสุดด้วย null
Sergiy Kolodyazhnyy

2

สร้างฟังก์ชั่นเช่นนี้:

repeat() { 
    for suffix in "${@:2}";
    do
        eval "$1""$suffix";
    done
}

repeat 'apt up' {date,grade}จากนั้นคุณสามารถเรียกใช้ สิ่งนี้มีประโยชน์ในการนำมาใช้ซ้ำสำหรับคำสั่งที่แตกต่างกันโดยสิ้นเชิงแม้ว่าจะไม่ได้ช่วยให้คุณพิมพ์คำสั่งนี้ได้

ฉันเห็นด้วยกับคำตอบอื่น ๆ ที่แน่นอนว่าสิ่งนี้อาจมีประโยชน์มากกว่า:

alias apt-up='apt update && apt upgrade'

0

@ คำตอบของ muru ทำให้ฉันอ่านเกี่ยวกับการขยายประวัติและฉันพบตัวแปรอื่น

 $ sudo apt update
 $ ^dat^grad^

^string1^string2^คือการเทียบเท่า!!:s/string1/string2/ซึ่งจะนำคำสั่งสุดท้ายและแทนที่ด้วยstring1string2


-2

ฉันนำapt-get upส่วนของคำสั่งกลับมาใช้ใหม่โดยใช้ลำดับของคีย์ต่อไปนี้:

Up ArrowBackspaceBackspaceBackspaceBackspace

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.