Jak mogę przesłać wynik z which
polecenia do cd
?
Oto, co próbuję zrobić:
which oracle | cd
cd < which oracle
Ale żaden z nich nie działa.
Czy jest na to sposób (zamiast oczywiście kopiować / wklejać)?
Edycja: po namyśle to polecenie nie powiedzie się, ponieważ plik docelowy NIE jest folderem / katalogiem .
Zastanawiam się więc i opracowuję teraz lepszy sposób na pozbycie się końcowej części „/ oracle” (sed lub awk, a nawet Perl) :)
Edycja: OK, to, co mam na końcu:
cd `which oracle | sed 's/\/oracle//g'`
dirname
,basename
?Odpowiedzi:
Używasz potoku w przypadkach, gdy polecenie oczekuje parametrów ze standardowego wejścia. ( Więcej na ten temat ).
Z
cd
rozkazem tak nie jest. Katalog jest argumentem polecenia. W takim przypadku możesz użyć podstawiania poleceń. Użyj odwrotnych znaków lub,$(...)
aby ocenić polecenie, zapisz je w zmiennej.path=`which oracle` echo $path # just for debug cd $path
chociaż można to zrobić w dużo prostszy sposób:
cd `which oracle`
lub jeśli ścieżka zawiera znaki specjalne
cd "`which oracle`"
lub
cd $(which oracle)
co jest odpowiednikiem notacji odwrotnego znaku, ale jest zalecane (znaki odwrotne można pomylić z apostrofami)
.. ale wygląda na to, że chcesz:
cd $(dirname $(which oracle))
(co pokazuje, że możesz łatwo używać zagnieżdżania)
$(...)
(podobnie jak lewy apostrof) działają również w podwójnych cudzysłowach, co pomaga, gdy wynik może ostatecznie zawierać spacje.cd "$(dirname "$(which oracle)")"
(Zauważ, że oba wyjścia wymagają zestawu podwójnych cudzysłowów).
źródło
cd "$(dirname "$(which oracle)")"
.|
Otwiera nowy proces, więc nawet jeślicd
czytać ze standardowego wejścia,cmd | cd
nie będzie działać (czyli katalog bieżący w pierwotnym procesie pozostałaby taka sama).Z dirname, aby uzyskać katalog:
cd $(which oracle | xargs dirname)
EDYCJA: uważaj na ścieżki zawierające spacje, zobacz komentarz @anishpatel poniżej
źródło
cd "$(which oracle | xargs -0 dirname)"
jeśli ścieżka może zawierać spacje. Flaga -0 dzieli wejście przez null, a nie białe znaki.cd `which oracle`
Zwróć uwagę, że są to grawerunki (zwykle klawisz po lewej stronie 1 na klawiaturze amerykańskiej)
źródło
cd "`which oracle`"
OK, tutaj rozwiązanie wykorzystujące prawidłowe cytowanie:
cd "$(dirname "$(which oracle)")"
Unikaj cudzysłowów, są one mniej czytelne i zawsze cytują podstawienia procesu.
źródło
Nie potrzebujesz potoku, możesz robić, co chcesz, używając rozszerzenia parametrów Bash!
Kolejna wskazówka: użyj "type -P" zamiast zewnętrznego polecenia "which", jeśli używasz 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
źródło
W odpowiedzi na edytowane pytanie możesz usunąć nazwę polecenia za pomocą
dirname
:cd $(dirname `which oracle`)
źródło
Oprócz dobrej odpowiedzi powyżej, należy wspomnieć, że cd jest wbudowaną powłoką, która działa w tym samym procesie, innym niż nowy proces, taki jak ls, który jest poleceniem.
/unix/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd
http://en.wikipedia.org/wiki/Shell_builtin
źródło