Как я могу передать результат команды which
на cd
?
) Это то, что я пытаюсь сделать:
which oracle | cd
cd < which oracle
Но ни один из них не работает.
Есть ли способ добиться этого (вместо копирования / вставки, конечно)?
Редактировать: если подумать, эта команда не будет выполнена, потому что файл назначения НЕ является папкой / каталогом .
Так что я думаю и разрабатываю лучший способ избавиться от конечной части "/ oracle" сейчас (sed или awk, или даже Perl):)
Редактировать : Хорошо, вот что я получил в итоге:
cd `which oracle | sed 's/\/oracle//g'`
Канал используется в случаях, когда команда ожидает параметры из стандартного ввода. ( Подробнее об этом ).
С командой 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)")"
(Обратите внимание, что для обоих выходных данных требуется набор двойные кавычки.)
cd `which oracle`
Обратите внимание, что это обратные кавычки (обычно клавиша слева от 1 на клавиатуре США)
Хорошо, вот решение, использующее правильное цитирование:
cd "$(dirname "$(which oracle)")"
Избегайте обратных кавычек, они менее читабельны и всегда заключают в кавычки замены процесса.
Канал вам не нужен, вы можете делать все, что хотите, используя расширение параметров 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
With dirname чтобы получить каталог:
cd $(which oracle | xargs dirname)
РЕДАКТИРОВАТЬ: остерегайтесь путей, содержащих пробелы, см. комментарий @anishpatel ниже
В ответ на ваш отредактированный вопрос вы можете удалить имя команды, используя dirname
:
cd $(dirname `which oracle`)