Para o script bash, eu posso usar "[email protected]"
para acessar argumentos. Qual é o equivalente quando eu uso um alias?
Aliases são como comandos, pois todos os argumentos para eles são passados como argumentos para o programa que eles alias. Por exemplo, se você quiser alias ls
a ls -la
e digitando ls foo bar
realmente executa ls -la foo bar
na linha de comando.
Se você deseja ter controle real sobre como os argumentos são interpretados, você pode escrever uma função como esta:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "[email protected]"
}
Solução de alias
Se você é realmente contra usar uma função em si, você pode usar:
$ alias wrap_args='f(){ echo before "[email protected]" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
Você pode substituir [email protected]
com $1
se você quiser apenas o primeiro argumento.
Explicação
Isso cria uma função temporária f
, à qual são passados os argumentos.
Argumentos de alias são passados apenas no final. Observe que f
é chamado no final do alias.
O unset -f
remove a definição da função à medida que o alias é executado, para que não fique por aí depois.
Adicionando às respostas presentes, uma coisa importante a ser percebida sobre como funcionam os aliases é que todos os parâmetros digitados após um comando com alias serão usados literalmente no final. Portanto, não há como usar o alias para dois comandos (canalizados ou não), dos quais o primeiro deve interpretar os parâmetros. Para deixar claro, aqui está um exemplo de algo que não funcionaria conforme o esperado:
alias lsswp="ls -l | grep swp"
(um exemplo inspirado em esta pergunta ) isso sempre usará a saída de ls -l
realizado no diretório atual e faça um grep sobre isso - usando
lsswp/tmp /
seria equivalente a ls -l | grep swp /tmp/
e não ls -l /tmp/ | grep swp
.
Para todos os propósitos em que os argumentos devem ser usados em algum lugar no meio, é preciso usar um function
em vez de alias
.
Você não precisa fazer nada, na verdade; aliases fazem isso automaticamente. Por exemplo:
$ alias less="less -eirqM"
$ less foo.txt
Você verá a primeira página de foo.txt e less
será encerrada em EOF (-e), as pesquisas não diferenciam maiúsculas de minúsculas (-i) etc.).
Estou respondendo pelo csh:
Sim, você pode usar os parâmetros em pseudônimos e - como uma diferença do que foi dito acima - você pode consultá-los em qualquer lugar na definição de pseudônimo - não apenas no final.
Exemplo para algo tar-gz -ing:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, Onde !:1
e !:2
são os parâmetros que você fornecerá ao chamar seu alias.
Exemplo de uso:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
O que significa efetivamente que você usou dois parâmetros inseridos em locais arbitrários do comando tar, transformando tudo em um alias tgz