dans Bash, comment ne pas inclure d'arguments supplémentaires dans un alias?

10

J'essaye de faire quelque chose comme

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

juste pour que ftpcela ne soit pas utilisé accidentellement. Mais j'ai remarqué que

ftp abcd.com

provoquera un écho de la commande

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

parce que le abcd.comest considéré comme un argument pour echo.

Existe-t-il un moyen de faire en sorte que Bash ne s'ajoute pas abcd.comà la substitution ou echone le prenne pas comme arguments supplémentaires? (Existe-t-il une solution pour chaque approche?)

Je suppose que je pourrais y arriver

alias ftp='sftp'

mais je veux juste arrêter la commande tous ensemble pour me rappeler de ne pas l'utiliser ftp.

non-polarité
la source
3
La plupart du temps, vous pouvez interdire ftpde différentes manières, mais si vous le souhaitez - utilisez printfplutôt echo:printf "Do not use ftp. Use sftp instead.\n\c"
Costas
Ajouter echol' sftpalias? ie alias ftp='echo "Do not use ftp"; sftp'. Vous obtiendrez le rappel, tout en étant obligé d'utiliser sftp.
Josh Jolly
@JoshJolly Je voulais faire l'ordre d'arrêter tous ensemble au lieu de le laisser "naviguer" juste pour qu'on me rappelle constamment de ne pas utiliserftp
non
1
Notez que les alias sont extrêmement simples; ils ne sont rien d'autre qu'une simple substitution de chaîne (avec les limitations supplémentaires que (1) la substitution ne se produit qu'au début de la chaîne de commande, et (2) elle est non récursive). Il n'y a aucun moyen de "configurer" le fonctionnement d'un alias au-delà de la définition de l'alias lui-même.
Kyle Strand
Euh ... désolé, les alias sont récursifs. Je ne sais pas à quoi je pensais.
Kyle Strand

Réponses:

18

Lorsque vous définissez un alias, la commande que vous définissez est exécutée à la place de celle que vous avez écrite. Cela signifie que lorsque vous exécutez ftp abc.com, ce qui est réellement exécuté est

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

Une solution simple consiste à utiliser une fonction au lieu d'un alias:

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

Alternativement, vous pouvez utiliser printfcomme suggéré par Costas:

alias ftp="printf 'do not use ftp. Use sftp instead\n'"
terdon
la source
16
alias ftp='echo do not use ftp. Use sftp instead. # '
Hauke ​​Laging
la source
7
+1. Pourtant, cela me rappelle en quelque sorte les injections SQL: ') Douce astuce.
John WH Smith
9

Mettez simplement un espace et le caractère de commentaire #à la fin de la chaîne d'alias:

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

Cela entraînera le traitement des paramètres comme un commentaire. N'oubliez pas d'ajouter un espace avant, #sinon il ne sera pas interprété comme un jeton séparé après l'extension de l'alias.

pabouk
la source