Bash - как передать результат, с какой командой на cd

Как я могу передать результат с помощью команды which на cd?

Это то, что я пытаюсь сделать:

which oracle | cd
cd < which oracle

Но никто из них не работает.

Есть ли способ достичь этого (а не копировать/вставлять, конечно)?

Изменить: с другой стороны, эта команда потерпит неудачу, потому что целевой файл НЕ является папкой/каталогом.

Итак, я думаю и разрабатываю лучший способ избавиться от конечной части "/oracle" (sed или awk или даже Perl):)

Изменить: Хорошо, что я получил в конце:

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

Ответ 1

Вы используете канал в случаях, когда команда ожидает параметров со стандартного ввода. (Подробнее об этом).

С командой cd это не так. Каталог - это аргумент команды. В таком случае вы можете использовать подстановку команд. Используйте backticks или $(...), чтобы оценить команду, сохраните ее в переменной..

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

хотя это можно сделать гораздо проще:

cd `which oracle` 

или если ваш путь имеет специальные символы

cd "`which oracle`"

или

cd $(which oracle)

что эквивалентно нотации обратного хода, но рекомендуется (backticks можно путать с апострофами)

.. но похоже, что вы хотите:

cd $(dirname $(which oracle))

(который показывает, что вы можете легко использовать вложенность)

$(...) (а также backticks) работают также в строках с двойными кавычками, что помогает, когда результат может в конечном итоге содержать пробелы.

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

(Обратите внимание, что для обоих выходов требуется набор двойных кавычек.)

Ответ 2

С именем dirname для получения каталога:

cd $(which oracle | xargs dirname)

EDIT: остерегайтесь путей, содержащих пробелы, см. комментарий @anishpatel ниже

Ответ 3

cd `which oracle`

Обратите внимание, что это backticks (обычно клавиша слева от 1 на американской клавиатуре)

Ответ 4

ОК, вот решение, которое использует правильное цитирование:

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

Избегайте обратных ссылок, они менее читабельны и всегда ссылаются на подстановки процесса.

Ответ 5

Вам не нужен канал, вы можете делать то, что хотите, используя расширение параметра Bash!

Дальше совет: используйте "type -P" вместо внешней команды "which", если вы используете 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

Ответ 6

В ответ на ваш отредактированный вопрос вы можете отключить имя команды, используя dirname:

cd $(dirname `which oracle`)