หลายคำสั่งในนามแฝงสำหรับทุบตี


210

ฉันต้องการกำหนดนามแฝงที่รันสองคำสั่งต่อไปนี้อย่างต่อเนื่อง

gnome-screensaver
gnome-screensaver-command --lock

ตอนนี้ฉันได้เพิ่ม

alias lock='gnome-screensaver-command --lock'

เป็น. bashrc ของฉัน แต่เนื่องจากฉันล็อคเวิร์กสเตชันของฉันบ่อยครั้งมันจะง่ายกว่าถ้าพิมพ์คำสั่งเดียว

คำตอบ:


390

ลอง:

alias lock='gnome-screensaver; gnome-screensaver-command --lock'

หรือ

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

ใน. bashrc ของคุณ

โซลูชันที่สองช่วยให้คุณสามารถใช้อาร์กิวเมนต์


7
ไม่ควรที่จะเป็น "function lock () {blah}"?
emeraldjava

2
คุณจะผ่านการโต้แย้งได้อย่างไร ตัวแปรการซ้อน 'msg' ในlock()วงเล็บให้ข้อผิดพลาดsyntax error near unexpected token msg'` ..
geotheory

8
เมื่อฟังก์ชั่นได้รับการกำหนดมันจะทำงานเหมือนคำสั่ง: ข้อโต้แย้งอยู่ในบรรทัดคำสั่งคั่นด้วยช่องว่าง ในส่วนการประกาศอาร์กิวเมนต์คือ$1, $2... ในส่วนของฟังก์ชัน
mouviciel

1
Downvote สำหรับไม่รวม alias line สำหรับ params
Philip Rego

2
@PhilipRego - ฉันยินดีที่จะเรียนรู้จากคุณและยกเลิกคำตอบของคุณ
mouviciel

79

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

alias lock='gnome-screensaver && gnome-screensaver-command --lock'

ตอนนี้คำสั่งที่สองจะไม่พยายามแม้กระทั่งถ้าคำสั่งแรกไม่สำเร็จ คำอธิบายที่ดีกว่าของการประเมินการลัดวงจรอธิบายไว้ในคำถาม SOนี้


5
น่าแปลกที่พยายามนี้ด้วยgit fetch && git pull origin masterและไม่ได้ทำงานสำหรับฉันจนกว่าฉันจะถูกแทนที่ด้วย&& ;
hakunin

3
อาจเป็นเพราะการดึงข้อมูลคอมไพล์ได้ส่งคืนอย่างอื่นมากกว่า 0 หรือไม่?
RobAu

ช่วย! ทำงานให้ฉันได้ที่ Xubuntu 16.04.3
Fernando León

Downvote สำหรับไม่รวม alias line สำหรับ params
Philip Rego

18

นามแฝงมีความหมายสำหรับนามแฝงชื่อคำสั่ง สิ่งใดนอกเหนือจากนั้นควรทำด้วยฟังก์ชั่น

alias ll='ls -l' # The ll command is an alias for ls -l

ชื่อแทนคือชื่อที่ยังคงเชื่อมโยงกับชื่อเดิม เป็นเพียงชนิดเฉพาะเล็กน้อยllls

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    elif exists diff; then
        diff -ur "$@"
    elif exists comm; then
        comm -3 "$1" "$2"
    fi | less
}

ฟังก์ชั่นเป็นคำสั่งใหม่ที่มีตรรกะภายใน มันไม่ใช่แค่เปลี่ยนชื่อของคำสั่งอื่น มันจะดำเนินการภายใน

ในทางเทคนิคแล้วนามแฝงในภาษา Bash shell นั้นมีข้อ จำกัด ในด้านความสามารถที่ไม่เหมาะสมอย่างยิ่งสำหรับสิ่งที่เกี่ยวข้องกับคำสั่งเดียวมากกว่า ใช้พวกมันเพื่อสร้างการกลายพันธุ์เล็กน้อยของคำสั่งเดียว

เนื่องจากความตั้งใจคือการสร้างคำสั่งใหม่ที่ดำเนินการการดำเนินการซึ่งภายในจะแก้ไขในคำสั่งอื่น ๆ คำตอบที่ถูกต้องคือการใช้ฟังก์ชั่นที่นี่:

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

การใช้นามแฝงในสถานการณ์เช่นนี้เกิดปัญหามากมาย ตรงกันข้ามกับฟังก์ชั่นซึ่งดำเนินการเป็นคำสั่งนามแฝงจะถูกขยายเข้าไปในคำสั่งปัจจุบันซึ่งจะนำไปสู่ปัญหาที่ไม่คาดคิดเมื่อรวม "คำสั่ง" นามแฝงนี้กับคำสั่งอื่น พวกเขายังไม่ทำงานในสคริปต์


มันจะดีที่สุดถ้าคุณสามารถให้ตัวอย่างกับคำตอบของคุณ รอการอัพเดท
Sajid Ali

1
Downvote สำหรับไม่รวม alias line สำหรับ params
Philip Rego

2
@PhilipRego alias ไม่รับพารามิเตอร์ อย่าลงคะแนนแอปเปิ้ลที่ไม่ใช่ส้ม กินส้มแทน เนื่องจากคำตอบอธิบายได้ดีเครื่องมือที่เหมาะสมที่นี่ไม่ใช่นามแฝง แต่เป็นฟังก์ชัน
lununath

ฉันหมายถึงพารามิเตอร์เช่นนี้ ฉันใช้คำพูดซ้อนกันผิด alias = "git commit -m 'init'; git push; สถานะ git"
Philip Rego

@PhilipRego คุณจำเป็นต้องใช้ฟังก์ชั่นไม่ใช่นามแฝง gps() { git commit -m 'init '; git push; git status; } ตามที่อธิบายไว้นามแฝงมีข้อ จำกัด มากบอบบางและมีความตั้งใจเพียงอย่างเดียวคือเปลี่ยนชื่อคำสั่ง การใช้เพื่อวัตถุประสงค์ที่ไม่เกี่ยวข้องจะนำคุณไปสู่ที่ร้อนเช่นที่คุณเพิ่งสัมผัส
lununath


4

สิ่งนี้จะรันคำสั่ง 2 หลังจากนั้นอีกหนึ่ง:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'

1

ดังนั้นใช้เซมิโคลอน:

alias lock='gnome-screensaver; gnome-screen-saver-command --lock'

วิธีนี้ใช้ไม่ได้ผลหากคุณต้องการระบุอาร์กิวเมนต์ให้กับคำสั่งแรก อีกวิธีหนึ่งคือสร้างสคริปต์เล็กน้อยในไดเรกทอรี $ HOME / bin


0

เพิ่ม 2 เซนต์ของฉันในการสนทนาอายุ 11 ปีลองนี้:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"


0

เพิ่มฟังก์ชั่นนี้ของคุณ~/.bashrcและรีสตาร์ทเครื่องหรือรันsource ~/.bashrc

function lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

วิธีนี้ทั้งสองคำสั่งจะทำงานทุกครั้งที่คุณป้อนlockในเทอร์มินัลของคุณ

ในกรณีเฉพาะของคุณการสร้างaliasอาจทำงานได้ แต่ฉันไม่แนะนำ โดยสัญชาตญาณเราคิดว่าค่าของนามแฝงจะทำงานเหมือนกับว่าคุณป้อนค่าในเทอร์มินัล อย่างไรก็ตามนั่นไม่ใช่กรณี:

กฎที่เกี่ยวข้องกับคำจำกัดความและการใช้นามแฝงค่อนข้างสับสน

และ

เกือบทุกวัตถุประสงค์ฟังก์ชั่นเชลล์เป็นที่ต้องการมากกว่านามแฝง

ดังนั้นอย่าใช้นามแฝงเว้นแต่คุณจะต้อง https://ss64.com/bash/alias.html


-3

~/.bashrcผมเข้ามาปัญหาเมื่อประกาศชื่อแทนเข้า ~/.bashrcขั้วของฉันไม่รู้จักชื่อแทนผมประกาศใน ฉันได้เรียนรู้จากบทความ (แนบด้านล่าง) ที่ Mac OS X ทำงานlogin-shellตามค่าเริ่มต้นดังนั้นจึงเรียก~/.bash_profileแทน~/.bashrcแทน

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

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html


QA นี้เกี่ยวกับหลายคำสั่งในนามแฝงไม่ใช่ที่ที่จะวางนามแฝง
facuq

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