Как я могу передать результат which
команды cd
?
Вот что я пытаюсь сделать:
which oracle | cd
cd < which oracle
Но ни один из них не работает.
Есть ли способ добиться этого (вместо копирования / вставки, конечно)?
Изменить: если подумать, эта команда завершится ошибкой, потому что целевой файл НЕ является папкой / каталогом .
Итак, я думаю и разрабатываю лучший способ избавиться от конечной части "/ oracle" сейчас (sed или awk, или даже Perl) :)
Изменить: Хорошо, вот что у меня в итоге:
cd `which oracle | sed 's/\/oracle//g'`
dirname
,basename
?Ответы:
Вы используете конвейер в случаях, когда команда ожидает параметры из стандартного ввода. ( Подробнее об этом ).
В случае с
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 "$(dirname "$(which oracle)")"
.|
Открывает новый процесс, так что даже еслиcd
читать из STDIN,cmd | cd
не будет работать (т.е. текущий каталог в первоначальном процессе будет оставаться такой же).С dirname, чтобы получить каталог:
cd $(which oracle | xargs dirname)
EDIT: остерегайтесь путей, содержащих пробелы, см. Комментарий @anishpatel ниже
источник
cd "$(which oracle | xargs -0 dirname)"
если путь может содержать пробелы. Флаг -0 разделяет ввод на ноль, а не на пробел.cd `which oracle`
Обратите внимание, что это обратные кавычки (обычно клавиша слева от 1 на американской клавиатуре)
источник
cd "`which oracle`"
Хорошо, вот решение, использующее правильное цитирование:
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
источник
В ответ на ваш отредактированный вопрос вы можете удалить имя команды, используя
dirname
:cd $(dirname `which oracle`)
источник
Помимо хорошего ответа выше, необходимо упомянуть, что cd - это встроенная оболочка, которая запускается в том же процессе, кроме нового процесса, такого как ls, который является командой.
/unix/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd
http://en.wikipedia.org/wiki/Shell_builtin
источник