bash - как передать результат из команды which на cd

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

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

which oracle | cd
cd < which oracle

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

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

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

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

Редактировать : Хорошо, вот что я получил в итоге:

cd `which oracle | sed 's/\/oracle//g'`
78
задан ROMANIA_engineer 8 August 2017 в 17:21
поделиться

6 ответов

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

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

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

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

cd `which oracle` 

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

cd "`which oracle`"

или

cd $(which oracle)

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

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

cd $(dirname $(which oracle))

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

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

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

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

109
ответ дан 24 November 2019 в 10:34
поделиться
cd `which oracle`

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

9
ответ дан 24 November 2019 в 10:34
поделиться

Хорошо, вот решение, использующее правильное цитирование:

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

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

4
ответ дан 24 November 2019 в 10:34
поделиться

Канал вам не нужен, вы можете делать все, что хотите, используя расширение параметров 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
2
ответ дан 24 November 2019 в 10:34
поделиться

With dirname чтобы получить каталог:

cd $(which oracle | xargs dirname)

РЕДАКТИРОВАТЬ: остерегайтесь путей, содержащих пробелы, см. комментарий @anishpatel ниже

22
ответ дан 24 November 2019 в 10:34
поделиться

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

cd $(dirname `which oracle`)
1
ответ дан 24 November 2019 в 10:34
поделиться