di Bash, bagaimana cara tidak memasukkan argumen tambahan dalam alias?

10

Saya mencoba melakukan sesuatu seperti

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

hanya supaya ftptidak akan sengaja digunakan. Tapi saya perhatikan itu

ftp abcd.com

akan menyebabkan perintah bergema

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

karena abcd.comdianggap sebagai argumen untuk echo.

Apakah ada cara untuk membuat Bash tidak menambah abcd.comsubstitusi, atau menjadikannya echosebagai argumen tambahan? (Apakah ada solusi untuk setiap pendekatan?)

Saya kira saya bisa melakukannya

alias ftp='sftp'

tapi saya hanya ingin membuat perintah berhenti bersama untuk mengingatkan diri saya untuk tidak menggunakan ftp.

nonopolaritas
sumber
3
Sebagian besar Anda dapat melarang ftpdengan cara yang berbeda, tetapi jika Anda ingin melakukannya - gunakan printfalih-alih echo:printf "Do not use ftp. Use sftp instead.\n\c"
Costas
Tambahkan echoke sftpalias? yaitu alias ftp='echo "Do not use ftp"; sftp'. Anda akan mendapatkan pengingat, sementara itu juga dipaksa untuk digunakan sftp.
Josh Jolly
@JoshJolly Saya ingin membuat perintah untuk menghentikan semua bersama-sama alih-alih membiarkannya "berlayar" hanya supaya saya terus-menerus diingatkan untuk tidak menggunakanftp
nonopolaritas
1
Perhatikan bahwa alias sangat sederhana; mereka tidak lebih dari substitusi string sederhana (dengan batasan tambahan yang (1) substitusi hanya terjadi di awal string perintah, dan (2) itu tidak rekursif). Tidak ada cara untuk "mengkonfigurasi" cara kerja alias di luar definisi alias itu sendiri.
Kyle Strand
Er ... maaf, alias bersifat rekursif. Tidak yakin apa yang saya pikirkan.
Kyle Strand

Jawaban:

18

Saat Anda mendefinisikan alias, perintah yang Anda tetapkan dijalankan alih-alih yang Anda tulis. Ini berarti bahwa ketika Anda menjalankan ftp abc.com, apa yang sebenarnya dieksekusi adalah

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

Solusi sederhana adalah menggunakan fungsi alih-alih alias:

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

Atau, Anda dapat menggunakan printfseperti yang disarankan oleh Costas:

alias ftp="printf 'do not use ftp. Use sftp instead\n'"
terdon
sumber
16
alias ftp='echo do not use ftp. Use sftp instead. # '
Hauke ​​Laging
sumber
7
+1. Namun entah bagaimana ini mengingatkan saya pada suntikan SQL: ') Trik manis.
John WH Smith
9

Cukup beri spasi dan karakter komentar #di akhir string alias:

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

Ini akan menyebabkan parameter diperlakukan sebagai komentar. Hanya saja, jangan lupa untuk menambahkan spasi sebelum #jika tidak maka tidak akan ditafsirkan sebagai token terpisah setelah ekspansi alias.

pabouk
sumber