ใน Bash จะไม่รวมอาร์กิวเมนต์พิเศษในนามแฝงได้อย่างไร


10

ฉันพยายามทำบางสิ่งเช่น

alias ftp='echo do not use ftp. Use sftp instead.'

เพียงเพื่อที่ftpจะไม่ถูกใช้โดยไม่ได้ตั้งใจ แต่ฉันสังเกตเห็นว่า

ftp abcd.com

จะทำให้คำสั่งดังก้อง

do not use ftp. Use sftp instead. abcd.com

เพราะจะนำไปเป็นข้อโต้แย้งสำหรับabcd.comecho

มีวิธีที่จะทำให้ Bash ไม่ได้เพิ่มabcd.comการทดแทนหรือechoไม่ใช้มันเป็นอาร์กิวเมนต์พิเศษหรือไม่? (มีวิธีแก้ปัญหาสำหรับแต่ละวิธีหรือไม่)

ฉันคิดว่าฉันสามารถทำได้

alias ftp='sftp'

ftpแต่ฉันเพียงแค่ต้องการให้หยุดคำสั่งทั้งหมดเข้าด้วยกันเพื่อเตือนตัวเองไม่ให้ใช้


3
ส่วนใหญ่คุณสามารถห้ามftpในวิธีที่แตกต่างกัน แต่ถ้าคุณต้องการที่จะทำ - ใช้printfแทนecho:printf "Do not use ftp. Use sftp instead.\n\c"
Costas

เพิ่มechoไปยังsftpนามแฝง? alias ftp='echo "Do not use ftp"; sftp'กล่าวคือ sftpคุณจะได้รับการแจ้งเตือนในขณะที่ยังถูกบังคับให้ใช้
Josh Jolly

@JoshJolly ฉันต้องการที่จะทำให้คำสั่งหยุดทั้งหมดเข้าด้วยกันแทนที่จะปล่อยให้มัน "แล่นผ่าน" เพียงเพื่อที่ฉันจะได้รับการเตือนเสมอว่าจะไม่ใช้ftp
nonopolarity

1
โปรดทราบว่านามแฝงนั้นง่ายมาก พวกเขาจะไม่มีอะไรมากไปกว่าเปลี่ยนตัวสตริงง่าย (ที่มีข้อ จำกัด เพิ่มเติมที่ (1) เปลี่ยนตัวเกิดขึ้นเฉพาะที่จุดเริ่มต้นของสตริงคำสั่งและ (2) มันเป็นเรื่องที่ไม่ recursive) ไม่มีวิธี "กำหนดค่า" ว่านามแฝงทำงานอย่างไรนอกเหนือจากคำจำกัดความของนามแฝงเอง
Kyle Strand

เอ่อ ... ขอโทษนามแฝงเป็น recursive ไม่แน่ใจว่าฉันคิดอะไรอยู่
Kyle Strand

คำตอบ:


18

เมื่อคุณกำหนดนามแฝงคำสั่งที่คุณตั้งค่าจะถูกเรียกใช้แทนคำสั่งที่คุณเขียน ซึ่งหมายความว่าเมื่อคุณเรียกใช้ftp abc.comสิ่งที่ดำเนินการจริงคือ

echo do not use ftp. Use sftp instead abc.com

ทางออกที่ง่ายคือการใช้ฟังก์ชั่นแทนนามแฝง:

ftp(){ echo 'do not use ftp. Use sftp instead'; }

หรือคุณสามารถใช้printfตามที่ Costas แนะนำ:

alias ftp="printf 'do not use ftp. Use sftp instead\n'"


9

เพียงแค่ใส่ช่องว่างและอักขระความคิดเห็น#ท้ายสตริง alias:

alias ftp='echo do not use ftp. Use sftp instead. #'
ftp abcd.com
do not use ftp. Use sftp instead.

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

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