bash - как передать результат от команды which на cd
как я мог передать результат из до cd
?
вот что я пытаюсь сделать:
which oracle | cd
cd < which oracle
но ни один из них не работает.
есть ли способ, чтобы достичь этого (а не копировать/вставить, конечно)?
Edit : с другой стороны, эта команда не будет выполнена, потому что файл назначения не является папкой/каталогом.
поэтому я думаю и разрабатываю лучший способ избавиться от трейлинга "/oracle " часть теперь (sed или awk, или даже Perl):)
изменить : Хорошо, вот что я получил в конце концов:
cd `which oracle | sed 's//oracle//g'`
7 ответов:
вы используете pipe в тех случаях, когда команда ожидает параметры от стандартного ввода. (подробнее об этом).
С это не так. Каталог является аргументом команды. В таком случае можно использовать подстановку команд. Используйте обратные палочки или
$(...)
чтобы оценить команду, сохраните ее в переменной..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)")"
(обратите внимание, что оба выходы требуют набора двойных кавычек.)
С dirname, чтобы получить каталог:
cd $(which oracle | xargs dirname)
EDIT: остерегайтесь путей, содержащих пробелы, см. комментарий @anishpatel ниже
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
в ответ на отредактированный вопрос вы можете удалить имя команды с помощью
dirname
:cd $(dirname `which oracle`)