В ударе я рекомендую type -p
which
. which
внешняя команда, и это время от времени хитро. Можно использовать sed
удалить все после финала /
, или используйте специального назначения dirname
утилита.
cd "$(dirname -- "$(type -p program)")"
cd "$(type -p program | sed 's:[^/]*$::')"
На командной строке, если Вы знаете, что каталог не содержит специальных символов (пробел или \[?*
), можно опустить кавычки. Можно также использовать одинарные левые кавычки вместо одного из $(…)
(вложенные одинарные левые кавычки являются трудными, не стоят того здесь).
cd `dirname $(type -p program)`
cd $(dirname `type -p program`)
cd `type -p program | sed 's:[^/]*$::'`
В zsh существует более компактный синтаксис.
cd ${$(whence -p program):h}
cd ${$(echo =program):h}
cd ${${_+=program}:h}
(Да, тот последний является загадочным. Это использует ${VAR+TEXT}
синтаксис на _
переменная, со значением тем, чтобы быть =program
который эквивалентен $(whence -p program)
.)
Вы не должны делать двух соединений, чтобы сделать то, что Вы делаете. Принятие ssh-copy-id
не будет работать на Вас, вот что-то из сценария, который я записал давным-давно (прежде чем я знал о ssh-copy-id), который делает это в одном ssh:
tar c $keys | ssh "$1" "set -e; cd \`mktemp -d\`; tar x; mkdir -p ~/.ssh; chmod go-w ~/.ssh; cat $keys >> ~/.ssh/authorized_keys; chmod go-w ~/.ssh/authorized_keys"
Да, это - одна огромная строка. $keys
содержит названия всех открытых ключей (помните, это - старый сценарий):
keys=''
for k in identity.pub id_rsa.pub id_dsa.pub; do
[ -e ~/.ssh/$k ] && keys="$keys $k"
done
Ключевой вещью является ssh, двоично-безопасный транспорт, таким образом, можно использовать его для передачи tar для объяснения файлов на той же сессии, как выполняет chmod, и т.д.