bash - как передать результат из команды which на cd - PullRequest
74 голосов
/ 09 августа 2010

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

Вот что я пытаюсь сделать:

which oracle | cd
cd < which oracle

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

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

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

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

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

cd `which oracle | sed 's/\/oracle//g'`

Ответы [ 7 ]

104 голосов
/ 09 августа 2010

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

С командой 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)")"

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

22 голосов
/ 09 августа 2010

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

cd $(which oracle | xargs dirname)

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

8 голосов
/ 09 августа 2010
cd `which oracle`

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

4 голосов
/ 09 августа 2010

ОК, вот решение, которое использует правильное цитирование:

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

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

2 голосов
/ 09 августа 2010

Вам не нужен канал, вы можете делать то, что хотите, используя расширение параметров 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
1 голос
/ 09 августа 2010

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

cd $(dirname `which oracle`)
0 голосов
/ 24 августа 2014

помимо хорошего ответа выше, необходимо упомянуть, что cd - это встроенная оболочка, которая выполняется в том же процессе, отличном от нового процесса, как ls , который является командой.

  1. https://unix.stackexchange.com/questions/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd

  2. http://en.wikipedia.org/wiki/Shell_builtin

...