bash - как передать результат от команды which на cd


как я мог передать результат из до cd?

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

which oracle | cd
cd < which oracle

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

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

Edit : с другой стороны, эта команда не будет выполнена, потому что файл назначения не является папкой/каталогом.

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

изменить : Хорошо, вот что я получил в конце концов:

cd `which oracle | sed 's//oracle//g'`
7 68

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`)

кроме хорошего ответа выше, одна вещь должна упомянуть, что 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