Execute um comando sombreado por um alias

164

Digamos que eu tenho o seguinte alias no bash - alias ls='ls --color=auto'- e quero chamar comum lssem opções. A única maneira de fazer isso é unalias, execute o comando e, em seguida, alias novamente? Ou há algum truque bacana ou solução alternativa?

Mirzhan Irkegulov
fonte
2
Apenas uma observação sobre algumas das respostas abaixo: "comando" é a ÚNICA maneira segura de fazer isso. Por exemplo, o "." ou a "origem" interna pode ser substituída por uma função definida por script. "comando". ou "fonte de comando" é a única maneira de executar a fonte com segurança sem que a função definida por script seja invocada. Nenhuma das outras alternativas, incluindo o método de barra invertida "\.", Funciona e, é claro, não existe uma alternativa "/ bin / source" que você possa chamar especificando um caminho completo.
DeJay Clayton

Respostas:

211

Você também pode prefixar uma barra invertida para desativar o alias: \ls

Editar: Outras maneiras de fazer o mesmo incluem:

Use "command": command lsconforme Mikel .

Use o caminho completo: /bin/lsconforme uther .

Cite o comando: "ls"ou 'ls'conforme o comentário de Mikel.

Você pode remover temporariamente o alias dessa sessão de terminal com unalias command_name.

não agora
fonte
Esta é a minha maneira padrão de fazer isso.
Ncmathsadist
muito bom, também funciona bem com tcsh
Levon
10
Desta forma é muito útil. Ignora apenas aliases, não funções, o que o torna diferente de commandou builtin.
Mikel
1
Parece que l\sfaz a mesma coisa. Esse comportamento é um bug ou um recurso?
Niklas B.
4
É uma "característica". Somente aliases sem aspas são expandidos. Assim, você pode colocá-lo entre aspas ou usar uma barra invertida onde quiser. Consulte a referência de aliases do bash .
Mikel
79

É para isso que commandserve o comando.

Experimentar

command ls

Isso diz ao shell para ignorar aliases e funções.

Dessa maneira, é suportado pelo bash , zsh e ash / dash.

Mikel
fonte
2
Melhor resposta, por que não é a mais votada? :) +1
0xC0000022L
11
Porque ele adiciona 8 vezes o número de caracteres como a barra invertida método
JoelFan
1
@STATUS_ACCESS_DENIED Isso também não funciona com o tcsh (e, portanto, presumivelmente não com o csh). O método `\` does
Levon
3
O recurso de barra invertida não é seguro. Embora ofereça proteção contra aliases com nomes semelhantes, não fornece proteção contra funções com nomes semelhantes.
DeJay Clayton
2
@JoelFan Prefiro ter os poucos caracteres extras e ter meus scripts fáceis de seguir e trabalhar para todos. Em vez de uma barra enigmática que não é intuitiva, fácil de perder, não está bem documentada e não funciona para ignorar funções.
Dennis
19

O alias é apenas um atalho definido. Neste exemplo, o alias definido é a sequência lsque é executada ls --color=auto. Se você não deseja esse comportamento, pode chamar o binário lsusando o caminho absoluto.

Portanto, executar apenas /bin/lsproduzirá saída sem cor, porque não é o alias que você definiu.

Você também pode alterar o alias para algo diferente ou adicionar um novo alias que seja executado apenas lssem os parâmetros de cor.

George M
fonte
2
Você precisa saber onde está o comando. Em alguns sistemas, a divisão entre /bine /usr/biné arbitrária.
Keith Thompson
@KeithThompson Para isso, você poderia usar whichpara alguns comandos: which ls.
precisa saber é o seguinte
@ cst1992: Se você vai usar which(ou type), ele faz uma pesquisa via $PATH; você pode simplesmente usar lsou, em \lsvez de especificar o caminho.
21416 Keith Thompson
10

Outra maneira, com base na resposta do @ uther, é usar $(which ...)ou `which ...`(usando backticks ``) para encontrar automaticamente o caminho do executável. Isso funcionará em bash:

$(which ls)

`which ls`

Sem dúvida, simplesmente prefixar o comando com a \é muito mais curto.

ATUALIZAÇÃO : De acordo com Como usar `qual` em um comando com alias? , isso não parece ser confiável.

krlmlr
fonte
Para que servem os suportes? Eu acho que você pretende `which ls`executar o binário diretamente.
Amyassin
2
@amyassin: Ambas as sintaxes são equivalentes. (BTW, como você conseguiu os acentos graves para a formatação do código?)
krlmlr
Na verdade (which ls), não funcionou para mim (no Ubuntu 12.04 LTS) E os backticks eram difíceis, eu apenas os escapei: \ `what ls \`. Levou um monte de edição para chegar lá :)
amyassin
1
@ user946850 "Para incluir um caractere literal de backtick em um período de código, você pode usar vários backticks como delimitadores de abertura e fechamento". Fonte: Referência Markdown .
Mikel
@amyassin: Você adicionou o $?
Krlmlr
2

Pessoalmente, evito definir aliases com os mesmos nomes dos comandos, portanto, lssempre invoco o comando real. Eu tenho aliases ou funções para várias combinações de opções como l, ll, e lg. (Isso significa que eu preciso unalias lsno meu .bashrcou .cshrc.)

Acho que as suposições do SO sobre quais opções eu prefiro (substituindo as suposições dos projetistas do lspróprio comando) raramente correspondem aos meus gostos pessoais. Por acaso, não gosto do visual ls --color=auto, e sua legibilidade pode variar muito entre preto e branco e branco e preto.

YMMV, e as outras soluções ainda são boas de saber.

Keith Thompson
fonte
1

Digitar o comando em maiúsculas parece funcionar, tipo LS, embora eu não tenha muita certeza do porquê.

asmeurer
fonte
4
Em qual shell, qual sistema operacional, qual terminal etc.?
Mikel
@ Mikel Existe um pacote "sl" que fornece "sl" como "ls". As dicas que o bash dá no Ubuntu também dizem que "LS" é fornecido por "sl".
Izkata 25/05
1
Este é o bash 4 (instalado com o Fink) no Mac OS X 10.7. Também funciona para outros comandos que eu tenho como alias como rm e grep.
Asmeurer # 25/12
3
É apenas uma brincadeira :) a partir da página mn:LS - display animations aimed to correct users who accidentally enter LS instead of ls.
amyassin
7
Eu acho que isso funciona para o Mac OS X porque seu sistema de arquivos não diferencia maiúsculas de minúsculas por padrão. Não funcionará em outros unixes.
Jander