2010-08-09 8 views
63

Come è possibile reindirizzare il risultato da un comando which a cd?bash - come convogliare il risultato dal comando su cd

questo è quello che sto cercando di fare:

which oracle | cd 
cd < which oracle 

Ma nessuno di loro opere.

C'è un modo per ottenere questo (piuttosto che copiare/incollare ovviamente)?

Modifica: a pensarci bene, questo comando fallirebbe, perché il file di destinazione NON è una cartella/directory.

Così sto pensando e lavorando fuori un modo migliore per sbarazzarsi del trailing "/ oracle" parte oggi (sed o awk, o anche Perl) :)

Edit: Va bene che è quello che ho' ve ottenuto alla fine:

cd `which oracle | sed 's/\/oracle//g'` 
+2

che dà ordini, non directory – Anycorn

+0

stai cercando di ottenere la directory in cui è installato il programma? 'dirname',' basename '? – Anycorn

+0

@aaa: hai ragione, penso che dirname sia migliore perché punta a "la vera dir" non un link simbolico all'eseguibile di oracle ... che è il motivo per cui il mio app di sedativo fallirebbe :) –

risposta

87

si utilizza il tubo nei casi in cui il comando si aspetta che i parametri da standard input. (More on this).

Con il comando cd non è il caso. La directory è l'argomento del comando. In tal caso, è possibile utilizzare la sostituzione di comando. Utilizzare backticks o $(...) per valutare il comando, memorizzarlo nella variabile ..

path=`which oracle` 
echo $path # just for debug 
cd $path 

anche se può essere fatto in un modo molto più semplice:

cd `which oracle` 

o se il percorso ha caratteri speciali

cd "`which oracle`" 

o

cd $(which oracle) 

che è equivalente alla notazione backtick, ma è consigliato (backticks può essere confuso con gli apostrofi)

.. ma sembra che si desidera:

cd $(dirname $(which oracle)) 

(cui si dimostra che è possibile utilizzare la nidificazione facilmente)

$(...) (così come apici inversi) funzionano anche in stringhe tra doppi apici, che aiuta quando il risultato può eventualmente contenere spazi ..

cd "$(dirname "$(which oracle)")" 

(Si noti che entrambe le uscite richiedono una serie di virgolette doppie.)

+0

Cool. Potresti spiegare un po 'cosa sta succedendo qui? Sembra una dereferenziazione variabile; c'è qualche variabile temporanea di default in cui vanno a finire i risultati di un comando? –

+0

Ahhh, ho dimenticato il compelete sui backtick :( –

+4

Hai bisogno di un altro paio di virgolette: 'cd" $ (dirname "$ (che oracle)") "'. – Philipp

8
cd `which oracle` 

Nota quelle sono apici inversi (in genere la chiave a sinistra di 1 su una tastiera americana)

+0

Questo non funziona se il percorso contiene spazi o altri caratteri" speciali ", e tu devi togliere il nome del file. – Philipp

+0

@Philipp puoi usarlo se il tuo percorso ha caratteri speciali 'cd" \ "che oracolo \' "' –

1

In risposta alla tua domanda modificato, è possibile togliere il nome del comando usando dirname:

cd $(dirname `which oracle`) 
+0

Questo non funziona se il percorso contiene spazi o altri caratteri "speciali". – Philipp

+1

Fissato facilmente citandone il valore doppio –

17

Con nomedir per ottenere la directory:

cd $(which oracle | xargs dirname) 

EDIT: Attenzione ai percorsi contenenti spazi, vedi @anishpatel commento qui sotto

+1

Usa "cd" $ (che oracle | xargs -0 dirname) "" se il percorso può contenere spazi vuoti, il flag -0 divide l'input in base a null anziché in spazi bianchi – anishpatel

2

Non hai bisogno di un tubo, si può fare ciò che si desidera utilizzare l'espansione di parametro Bash!

Ulteriore suggerimento: utilizzare "tipo -P" invece del comando "quale" esterno se si utilizza Bash.

# test 
touch /ls 
chmod +x /ls 
cmd='ls' 
PATH=/:$PATH 
if cmdpath="$(type -P "$cmd")" && cmdpath="${cmdpath%/*}" ; then 
    cd "${cmdpath:-/}" || { echo "Could not cd to: ${cmdpath:-/}"; exit 1; } 
else 
    echo "No such program in PATH search directories: ${cmd}" 
    exit 1 
fi 
+3

com sbuccia la tua soluzione con quelli intorno a te ... – Thierry

3

OK, ecco una soluzione che utilizza corrette le citazioni:

cd "$(dirname "$(which oracle)")" 

Evitare backticks, sono meno leggibile, e sempre sostituzioni processo di citazione.