Use “cd -” sem nenhuma saída

28

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

Batandwa
fonte

Respostas:

32

Tente assim:

cd - > /dev/null

Você também pode fazer:

cd - > uselessfile

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

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

cd - >> uselessfile
erewok
fonte
15

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

O problema está no seu redirecionamento. Tu estás a escrever:

cd - 2>&1 /dev/null

que, como os redirecionamentos podem aparecer em qualquer lugar 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, torna-se:

cd - /dev/null

Vê 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 de uma vez, cdconsidera apenas seu primeiro argumento, que neste caso é o -.

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

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

cd - 2>&1 >/dev/null

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

Como alternativa, como foi sugerido por @demure , você pode usar &>para redirecionar os dois fluxos de uma só vez, se essa sintaxe for suportada pelo seu shell.

cd - &>/dev/null

Observe que qualquer uma dessas alternativas também silenciará o erro quando $OLDPWDnão existir mais, pois você está redirecionando a saída de erro padrão para o buraco negro do sistema. Se isso é uma preocupação, eu verificaria $?depois; você deve confirmar isso pessoalmente, se for uma preocupação real, mas, pelo menos nos meus testes, uma falha cd(seja cd $someplaceou cd -) ocorre $? = 1após o sucesso $? = 0.

um CVn
fonte
5

Talvez você possa usar

cd $OLDPWD

mas, neste caso, você precisará digitar mais :)

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

uzsolt
fonte
1
Se $OLDPWDnão estiver definido, isso fará você entrar ~. cd -imprimirá um erro (e presumivelmente deixará você onde você já estava).
um CVn
1
Você não está certo. Se $ OLDPWD estiver desabilitado (por quê? Talvez o usuário possa desabilitar isso), o 'cd -' terá o mesmo resultado que "cd $ OLDPWD". Verifique a página do manual ('cd -' é equivalente a 'cd "$ OLDPWD" && pwd'). Ou você pode testá-lo :) 'OLDPWD = ""; cd - '- veja que você entra em ~ e imprime um caractere ~.
Uzsolt
1
Eu apenas testei. No meu sistema, a sequência cd /tmp bash cd -diz bash: cd: OLDPWD not setno segundo cd; enquanto a sequência cd /tmp bash cd $OLDPWDcoloca você em ~ (quase certamente porque $ OLDPWD se expande para uma sequência vazia). cd $OLDPWDfuncionará bem depois que você tiver feito pelo menos um cddentro do shell em questão, mas não antes disso.
um CVn
Sim, você está certo. Eu testei com o zsh e com o zsh não descarta mensagem de erro.
Uzsolt
1

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

a &>é a versão abreviada da cd - 2>/dev/null 1>&2qual eu acho que você pretende usar ...

  • A nota &>precisa do bash> = 4.0.

Ps. a maioria dos comandos pode ser apontada para locais, por isso é improvável que você realmente precisecd

recatado
fonte
0

Você pode usar:

cd ~-

De acordo com a página de manual do bash em Tilde Expansion:

Se o prefixo til for um `~ - ', o valor da variável de shell OLDPWD, se estiver definido, será substituído.

Dru
fonte