Um, use funções para qualquer coisa não-trivial; um alias trivial seria definir algum sinalizador por padrão:
# no license spam
alias gdb='gdb -q'
para praticamente qualquer coisa mais complicada eu uso uma função.
Dois, command
refere-se a um comando, como /bin/ls
ou similares; aliases não são comandos nem comandos de funções. Você provavelmente não tem o comando win
, portanto, command win
falhará ao chamar a função, já que isso não é um comando.
Os loops "Infinite" são realmente fáceis de criar, a propósito
alias fooalias=foofunc
function foofunc() { fooalias; }
e é por isso que se alguém está escrevendo uma função com o mesmo nome de um comando então command
se torna muito útil, então o shell não tenta chamar a função para sempre:
# loops until stack death or segfault or something
function xterm() { xterm ... }
# good
function xterm() { command xterm ... }
Se você está apenas tentando obter alguma outra função para chamar outra coisa que pode ser um comando ou uma função, apenas chame-a como está. Aquele que precisa chamar o comando deve usar command
.
function winwinwin () { winwin ... }
function winwin () { win ... }
function win () { xterm ... }
function xterm () { command xterm ... }
winwinwin
chamaria a função winwin
chamaria a função win
chamaria a função xterm
e, em seguida, chamaria o nome command
.
No function
front, isso é opcional, mas eu o uso, pois torna a busca por funções bastante fácil ( fgrep function ...
) do que ter que procurar por coisas seguidas por espaços em branco e errar que os parênteses precisam ser ignorados. no motor regex que estou usando? Para a prioridade, é fácil fazer testes ou imprimir avisos que mostram o que está acontecendo:
ls () { ls -k; echo funcall; }
alias ls='echo blat'
ls
Em geral, é provavelmente uma idéia melhor definir as funções primeiro e os aliases depois desses serem configurados, para surpresa mínima:
bash-4.1$ alias ls='echo blat'
bash-4.1$ ls () { command ls -k; echo funcall; }
bash: syntax error near unexpected token '('
bash-4.1$ function ls () { command ls -k; echo funcall; }
bash-4.1$