ดูการขยายนามแฝงคำสั่ง


67

หากเรียกใช้watchคำสั่งที่มีนามแฝงคำสั่งนั้นจะไม่ขยายนามแฝง ฉันได้ลองทั้งด้วยการเสนอราคาเดี่ยวและการเสนอราคาซ้ำโดยแท้จริงแล้วได้รับชื่อแทนดังต่อไปนี้

# alias ll
alias ll='ls -l --color=tty'

คำสั่งต่อไปนี้จะล้มเหลว

# watch ll
sh: ll: command not found

ไม่ควรใช้การขยายบรรทัดคำสั่งในกรณีนี้

คำตอบ:


98

นามแฝงจะถูกขยายเป็นอาร์กิวเมนต์แรกเท่านั้นหรือหลังจากนามแฝงอื่นที่มีช่องว่างต่อท้ายที่ส่วนท้ายของคำสั่ง

จากbash's help alias:

ช่องว่างต่อท้ายใน VALUE ทำให้คำถัดไปถูกตรวจสอบสำหรับการทดแทนสมนามเมื่อนามแฝงถูกขยาย

หากต้องการทำสิ่งนี้ลองทำสิ่งต่อไปนี้:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

จำไว้ว่าบางรุ่นwatchสีแถบโดยค่าเริ่มต้นในบางรุ่นนี้สามารถหยุดโดยใช้หรือ--color-G


1
นี่คือคำตอบที่ยอดเยี่ยมอย่างแน่นอน! ขอขอบคุณและแน่นอน +1
ztank1013

1
ขอบคุณ ... ตลอดเวลานี้ฉันใช้ 1. พิมพ์ ll, 2. กด ctrl + alt + e, 3. จากนั้นดูคำนำหน้า นี่คือการประหยัดเวลา
anishsane

10
น่าเสียดายที่วิธีนี้มีข้อ จำกัด ที่คุณไม่สามารถให้ตัวเลือกได้watchเนื่องจาก alias จะต้องเป็นคำถัดไปในขณะที่watchต้องการอาร์กิวเมนต์ก่อนที่คำสั่งจะทำงาน หากคุณพยายามwatch -n 10 <alias>ทุบตีจะไม่ขยายนามแฝง ในการแก้ไขปัญหานี้คุณต้องใช้นามแฝงที่มีตัวเลือกที่คุณต้องการ (เช่น `alias watch-10 = 'watch -n 10') ซึ่งยังคงมีพื้นที่ต่อท้าย
indiv

2

บางทีเราสามารถขยายชื่อแทนด้วยตนเองก่อนที่จะเห็นมันได้หรือไม่

watch $(alias ll | cut -d\' -f2)

คำอธิบาย

ผลลัพธ์ของalias llดูเหมือนว่า:

$ alias ll
alias ll='ls -lAGh'

ดังนั้นเราจึงตั้งค่าขอบเขตของการตัดเป็นเครื่องหมายคำพูดเดี่ยวและตัดฟิลด์ที่ 2 โดยปล่อย:

ls -lAGh

เช่นนามแฝงที่ขยาย ที่เป็นรูปแบบ args watchที่กำหนดให้

ทำให้ฟังก์ชั่นการใช้งานทำได้

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

จากนั้น

watcha ll

ทำงานตามที่ต้องการ นี่แย่มากและจะล้มเหลวในทุกสถานการณ์ ขอโทษ


0

ฉันคิดว่าที่นี่ปัญหาพื้นฐานคือในขณะที่กำลังดำเนินwatchการอาร์กิวเมนต์ให้กับ " sh -c" ซึ่งหมายความว่าหากนามแฝงllไม่ได้กำหนดไว้ในsh(dash shell's)สภาพแวดล้อมแล้วมันจะไม่ขยาย แต่ฉันผิดและนี่ไม่ใช่กรณีคำตอบของคริสข้างต้นนั้นถูกต้อง


2
ไม่แน่นอน ลองwatch 'alias ll="ls -l --color=tty"; type ll; ll'ดู
Chris Down

+1 สำหรับการตอบกลับทันทีเพื่อยืนยัน ฉันผิดไป
Sachin Divekar

@ChrisDown ดังนั้นแม้ว่านาฬิกาจะใช้sh -cคำอธิบายของคุณก็ใช้ได้shเช่นกัน ฉันถูกไหม?
Sachin Divekar

1
ขึ้นอยู่กับว่าเชลล์ใช้งานshอะไร ขอให้สังเกตว่ามันใช้งานได้ดีsh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
Chris Down

0

ได้watchเรียกใช้เชลล์แบบโต้ตอบใหม่ซึ่งจะขยายนามแฝง:

watch -x bash -i -c ll

( -xมีวัตถุประสงค์เพื่อหยุดการwatchใช้งานเป็นของตัวเองsh -cเพื่อห่อคำสั่งที่เรากำหนดไว้เราไม่ต้องการเพราะเราจำเป็นต้องส่งผ่าน-iไปยังshหรือbashเพื่อให้เป็นเชลล์แบบโต้ตอบที่อ่าน. bashrc และกำหนดนามแฝงด้วย-xดูดำเนินการ คำสั่งโดยใช้ exec.)

Gah อันที่จริงมันไม่ทำงาน หลังจากแสดงผลลัพธ์ของ 'll' หนึ่งครั้งจากนั้นนอนหลับ 2 วินาทีงานจะถูกทำให้เป็นแบ็คกราวน์โดยมีปริศนาเล็กน้อย:

1]+  Stopped                 watch -x bash -i -c ll

ทำไมมันถึงหยุด วงเล็บปีกกาเปิด[ไปที่ไหน ฉันคิดว่านี่เป็นคำตอบที่ดี แต่ฉันไม่สามารถทำงานได้

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