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?


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.


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.


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.


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.


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.


1

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.