กำหนดนามแฝงและใช้งานทันที


11

ในzshการทำงานนี้ได้ดี:

alias foo=ls
foo

แต่นี่ไม่ได้:

alias foo=ls; foo

การกด Enter เป็นช่วงเวลาพิเศษไม่ใช่ปัญหาเมื่อทำงานแบบโต้ตอบ แต่เมื่อทำงานผ่านsshมันก็กลายเป็นปัญหา:

% ssh zsh@server 'alias foo=ls; foo'
zsh:1: command not found: foo

แม้จะมีการขึ้นบรรทัดใหม่มันก็ไม่ทำงาน:

% ssh zsh@server 'alias foo=ls;
foo'
zsh:2: command not found: foo

สิ่งที่แปลกคือzshรู้ว่ามันเป็นนามแฝง:

% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence

จะบอกได้อย่างไรzshว่าชื่อแทนควรใช้งานอยู่?


มันเป็นปัญหาทั่วไปของ aliasing ฉันพยายามใช้bashและcshและพวกเขาประพฤติในลักษณะเดียวกัน ฉันหวังว่าบางคนสามารถอธิบายได้
Slyx

Bash ไม่ใช่ปัญหา: เซิร์ฟเวอร์ ssh 'shopt -s expand_aliases; alias jj = ls \ njj'
Ole Tange

คำตอบ:


9

คุณไม่สามารถทำได้.

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

วิธีที่ดีที่สุดที่คุณสามารถทำได้คือการกำหนดนามแฝงใน.zshrcหรือใช้ฟังก์ชันเช่นคำตอบหรือการใช้jimmijeval :

alias foo=ls; eval foo

มีเป็นกรณีพิเศษกับ zsh -c ในกรณีนี้นามแฝงที่กำหนดไว้.zshenvจะถูกขยาย


นั่นจะไม่อธิบายว่าทำไมssh host 'alias foo=bar<newline>foo'ไม่ทำงาน มีกรณีพิเศษสำหรับzsh -c
Stéphane Chazelas

หรือใช้alias foo=ls; eval foo
Stéphane Chazelas

@ StéphaneChazelas: ขอบคุณสำหรับข้อมูลอัปเดตกับพวกเขา เกี่ยวกับsshกรณีคุณช่วยกรุณาทำให้ชัดเจนยิ่งขึ้น ฉันคิดว่าคำสั่งยังคงอ่านได้ในครั้งเดียว
cuonglm

10

นี่เป็นปัญหาที่รู้จักกันดีซึ่งอธิบายไว้ในzshคู่มือภายใต้บทที่ ALIASING (ดูman zshmisc) วิธีที่แนะนำในการจัดการกับมันคือการใช้ฟังก์ชั่นแทนนามแฝง:

foo() { ls; } ; foo

หรือดีกว่าในกรณีของls:

foo() { ls -- "${@:-.}"; } ; foo

PS อัฒภาคที่ส่วนท้ายของนิยามฟังก์ชั่น (รายการ) และช่องว่างไม่จำเป็นใน zsh แต่เป็นนิสัยจากเปลือกหอยอื่น ๆ ฉันยังคงใส่พวกเขา


1

การใช้ c-shell (tcsh เป็นที่แน่นอน) จากบรรทัดคำสั่ง:

mymachine % alias showme "echo here it is"
mymachine % showme
here it is

หรือวางไว้ในไฟล์. cshrc จากนั้นให้ไฟล์นั้น:

mymachine % source ~/.cshrc

mymachine % showme
here it is

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