O problema é que as duas primeiras opções são projetadas apenas para lidar com aliases. Eles não são operadores de redirecionamento especiais que podem perceber se você tem uma função ou comando com o mesmo nome. Tudo o que eles fazem é impedir a expansão, que é o que um alias tenta fazer
alias v='sudo vim'
v x.txt
#automatically expands "v" to "sudo vim" and then does the rest of the command
# v x.txt ==> sudo vim x.txt
Bash apenas tenta expandir a primeira palavra de um comando usando a lista de aliases que conhece (que você pode obter com alias
). Os aliases não aceitam argumentos e só podem ser a primeira palavra (separados por espaços; vim x.txt
não será expandido em sudo vimim x.txt
usando o alias acima) em um comando para expandir adequadamente.
No entanto, a expansão nunca acontece com aspas simples: echo '$USER'
imprimirá literalmente $USER
e não o que a variável representa. Além disso, o bash expande \x
para x
(principalmente). Estas não são formas extra adicionais especificamente para escapar de um alias, elas são apenas parte de como a expansão do bash foi escrita. Assim, você pode usar esses métodos para deixar um alias sombrear um comando e ainda ter acesso ao comando real.
alias ls='ls -la'
ls foo.txt #will expand into ls -la foo.txt
\ls foo.txt #will expand into ls foo.txt
'ls' foo.txt #same as above
'ls foo.txt' #same as above
No entanto, eles não param as funções. Uma função não precisa de expansão para funcionar, é chamada com o seu nome.
ls () {
echo "not an alias"
}
alias ls='echo "an alias"'
ls foo.txt #will echo "an alias"
\ls foo.txt #will echo "not an alias"
'ls' foo.txt #will echo "not an alias"
command ls foo.txt #will actually run 'ls'