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`)
Ответ 7
Помимо хорошего ответа выше, нужно упомянуть, что cd - это встроенная оболочка, которая выполняется в том же процессе, что и новый процесс, например ls, который является команда.