Usa "cd -" senza alcun output


28

Come posso eseguire il cd -comando senza echeggiare alcun output?
Ho provato cd - 2>&1 /dev/nullma questo stampa la directory di destinazione.
La ragione di ciò è che vorrei usarlo come una funzione bash e preferirei non avere l'output non necessario.

Risposte:


32

Provalo in questo modo:

cd - > /dev/null

Puoi anche fare:

cd - > uselessfile

Questo invierà l'output al file "uselessfile" anziché a STDOUT.

È inoltre possibile aggiungere invece di creare o sovrascrivere il file.

cd - >> uselessfile

15

@erewok ha già risposto alla domanda , ma mi prenderò cura di spiegare cosa sta realmente accadendo e perché stai vedendo il comportamento che fai.

Il problema è con il reindirizzamento. Stai scrivendo:

cd - 2>&1 /dev/null

che poiché i reindirizzamenti possono apparire ovunque all'interno della riga di comando (puoi confermarlo tu stesso con qualcosa di semplice come echo a b 2>&1 c </etc/fstab d), dopo che i reindirizzamenti vengono eliminati diventa effettivamente:

cd - /dev/null

Vedi il problema? Stai passando due argomenti a cd, non un argomento e due reindirizzamenti. Dato che puoi essere sempre e solo in una directory corrente alla volta, cdconsidera solo il suo primo argomento, che in questo caso è il -.

Quello che probabilmente intendevi scrivere è un cdcomando con reindirizzamento di stderr e stdout su / dev / null. Ci sono due modi per farlo.

Il più semplice nel tuo caso sarebbe semplicemente informare la shell che vuoi reindirizzare, aggiungendo un >carattere. Questo è ciò che suggerisce @erewok.

cd - 2>&1 >/dev/null

Questo prima reindirizza stderr (descrittore di file 2) nel descrittore di file 1 (stdout), quindi reindirizza stdout (implicito 1) in / dev / null. Si noti che l'ordinamento è importante; non otterrai lo stesso risultato se inverti i reindirizzamenti, anche se in alcuni casi può sembrare che lo fai a causa di come il particolare programma utilizza i rispettivi flussi di output.

In alternativa, come è stato suggerito da @demure , è possibile utilizzare &>per reindirizzare entrambi i flussi contemporaneamente se questa sintassi è supportata dalla shell.

cd - &>/dev/null

Si noti che una qualsiasi di queste alternative silenzia anche l'errore quando $OLDPWDnon esiste più, poiché si sta reindirizzando l'output di errore standard nel buco nero del sistema. Se questa è una preoccupazione, vorrei controllare in $?seguito; dovresti confermarlo tu stesso se è una vera preoccupazione, ma almeno nei miei test, un insuccesso cd(se cd $someplaceo cd -) imposta $? = 1dopo il successo $? = 0.


5

Forse puoi usare

cd $OLDPWD

ma in questo caso dovrai scrivere di più :)

Ma avrai un vantaggio: se c'è qualche errore il messaggio non reindirizzerà in / dev / null.


1
Se $OLDPWDnon è impostato, questo ti farà entrare ~. cd -stamperà un errore (e presumibilmente ti lascerà dove eri già).
un CVn del

1
Non hai ragione Se $ OLDPWD non è impostato (perché? Forse l'utente può disinserirlo), 'cd -' ha lo stesso risultato di "cd $ OLDPWD". Controllare la pagina del manuale ('cd -' è equivalente 'cd "$ OLDPWD" && pwd'). Oppure puoi provarlo :) 'OLDPWD = ""; cd - '- vedi, passerai a ~ e stamperai un carattere ~.
uzsolt,

1
L'ho appena provato. Sul mio sistema, la sequenza cd /tmp bash cd -dice bash: cd: OLDPWD not setal secondo cd; mentre la sequenza cd /tmp bash cd $OLDPWDti porta in ~ (quasi certamente perché $ OLDPWD si espande in una stringa vuota). cd $OLDPWDfunzionerà bene dopo averne eseguito almeno uno cdall'interno della shell in questione, ma non prima di allora.
un CVn del

Hm, si, hai ragione. Ho provato con zsh e con zsh non rilascia messaggio di errore.
uzsolt,

1

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

la &>è la versione a corto di mano cd - 2>/dev/null 1>&2, che io quello che penso si intende utilizzare ...

  • La nota ha &>bisogno di bash> = 4.0.

Ps. la maggior parte dei comandi può essere indirizzata verso posizioni, quindi è improbabile che tu debba effettivamente farlocd


0

Puoi usare:

cd ~-

Secondo la pagina man di bash sotto Tilde Expansion:

Se il prefisso tilde è un `~ - ', il valore della variabile di shell OLDPWD, se impostato, viene sostituito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.