Use “cd -” sem qualquer saída

25

Como executo o comando cd - sem fazer eco em nenhuma saída?
Eu tentei cd - 2>&1 /dev/null , mas isso imprime o diretório de destino.
A razão para isso é que eu gostaria de usar uma função bash e preferiria não ter a saída desnecessária.

    
por Batandwa 09.05.2013 / 23:39

5 respostas

29

Experimente assim:

cd - > /dev/null

Você também pode fazer:

cd - > uselessfile

Isso enviará a saída para o arquivo "uselessfile" em vez de STDOUT.

Você também pode acrescentar, em vez de criar ou substituir o arquivo.

cd - >> uselessfile
    
por 09.05.2013 / 23:45
13

@erewok já respondeu à pergunta , mas vou tentar explicar o que realmente está acontecendo e por que você está vendo o comportamento que você faz.

O problema está no seu redirecionamento. Você está escrevendo:

cd - 2>&1 /dev/null

que porque os redirecionamentos podem aparecer em qualquer lugar dentro da linha de comando (você pode confirmar isso com algo simples como echo a b 2>&1 c </etc/fstab d ), depois que os redirecionamentos são removidos, na verdade se torna:

cd - /dev/null

Veja o problema? Você está passando dois argumentos para cd , não um argumento e dois redirecionamentos. Como você só pode estar em um diretório atual ao mesmo tempo, cd considera apenas seu primeiro argumento, que nesse caso é o - .

O que você provavelmente pretende escrever é um comando cd com o redirecionamento de stderr e stdout para / dev / null. Existem duas maneiras de fazer isso.

O mais fácil no seu caso seria simplesmente informar o shell que você deseja redirecionar, adicionando um caractere > . Isto é o que @erewok está sugerindo.

cd - 2>&1 >/dev/null

Primeiro, ele redireciona stderr (descritor de arquivo 2) para o descritor de arquivo 1 (stdout) e redireciona stdout (implícito 1) para / dev / null. Note que a encomenda é importante; você não obterá o mesmo resultado se reverter os redirecionamentos, embora em alguns casos possa parecer que você faz por causa de como o programa particular usa os respectivos fluxos de saída.

Como alternativa, conforme sugerido por @demure , você pode usar &> para redirecionar os dois fluxos de uma vez se esta sintaxe é suportada pelo seu shell.

cd - &>/dev/null

Observe que qualquer uma dessas alternativas também silenciará o erro quando $OLDPWD não existir mais, já que você está redirecionando a saída do erro padrão para o buraco negro do sistema. Se isso for uma preocupação, eu verificaria $? depois; você deve confirmar isso por si mesmo se for uma preocupação real, mas pelo menos nos meus testes, um cd (se cd $someplace ou cd - ) falha $? = 1 enquanto após sucesso $? = 0 .

    
por 10.05.2013 / 10:05
3

Talvez você possa usar

cd $OLDPWD

mas, neste caso, você precisará de mais digitação:)

Mas você terá uma vantagem: se houver algum erro, a mensagem não será redirecionada para / dev / null.

    
por 10.05.2013 / 07:26
1

Redirecionar stdout e stderr: cd - &>/dev/null

o &> é a versão curta de cd - 2>/dev/null 1>&2 , que eu acho que você queria usar ...

  • Observe que &> precisa de bash > = 4.0.

a maioria dos comandos pode ser apontada em locais, portanto, é improvável que você realmente precise cd

    
por 10.05.2013 / 07:01
0

Você pode usar:

cd ~-

De acordo com a página man bash sob Tilde Expansion :

If the tilde-prefix is a '~-', the value of the shell variable OLDPWD, if it is set, is substituted.

    
por 02.03.2018 / 04:25

Tags