У Вас есть Escape $
. Иначе $(ssh-agent -s)
будет оценен на Вашей локальной машине вместо машины шлюза.
ssh user@Gateway "ssh Target 'eval \$(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'"
Можно проверить результаты выхода при помощи эха
$ echo "foo $(echo bar)"
foo bar
$ echo "foo \$(echo bar)"
foo $(echo bar)
Обновление:
Более короткая альтернатива:
find . -maxdepth 1 -type d | cut -c 3-
Даст Вам имена, один на строку, без любых наклонных черт
С GNU find
можно использовать -printf
опция:
find . -maxdepth 1 -type d -printf '%f\n'
Как отмечено Paweł в комментариях, если Вы не хотите, чтобы текущий каталог был перечислен, добавляют -mindepth 1
, например:
find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
-printf
опция в последней спецификации POSIX и интересно, насколько портативный это-...
– rahmu
25.08.2012, 16:37
printf
опции упоминаются POSIX, и они, кажется, не поддерживаются частью из другого find
версии. Находка GNU может быть установлена в большинстве мест, так в этом смысле это портативно.
– Thor
25.08.2012, 16:52
Используя GNU находят, можно использовать-mindepth для предотвращения, находят от соответствия текущему каталогу:
find . -type d -maxdepth 1 -mindepth 1
Так как Вы не делаете этого рекурсивно, можно использовать шарик удара:
echo */
Добавление запаздывания / к шарику заставит только каталоги быть согласованными.
*/
промахи отмечают точкой файлы, и включает символьные ссылки. Это может или не может быть проблемой.
– Gilles 'SO- stop being evil'
25.08.2012, 02:18
Я обычно использую:
find * -type d
Но я не знаю - ли это правильный способ сделать то, что Вы хотите.
echo */
сделал бы то же самое, более или менее (оно пропускает точечные файлы и включает символьные ссылки), но затем joachim спросил бы, как удалить финал /
.
– Gilles 'SO- stop being evil'
25.08.2012, 02:17
Позволить sed
удалите те два символа:
find . -maxdepth 1 -type d | sed -e 's/^\.\///'
Я использовал бы:
find ./ -type d -maxdepth 1 -exec basename {} \;
В AIX параметр maxdepth не работает.
В общем, у меня работает:
find ./ -type d | вырезать -d "/" -f2 | sort -u
То, что вы ищете, называется basename
, оно игнорирует структуру каталогов unix
Пример ниже:
find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;
это исключит из вывода даже путь dir, устраняя необходимость cd
перед запуском команды
Некоторая дополнительная информация:
Я бы передал -exec
в качестве аргумента для find вместо |
(pipe) другой команды для вывода (избегая второй команды, перебирающей каждую строку вывода, при этом, в зависимости от вывода, это может улучшить производительность скрипта)
ПРИМЕЧАНИЕ: find
опции являются не позиционными (-maxdepth влияет на тесты, указанные до нее, а также на тесты, указанные после нее).
ls
. В то же время я отправил ссылку на то, почему это - плохая идея о другом ответе, который был удален с тех пор. В то время было только 2 ответа, и причина казалась очевидной. Я рад, что Вы указали на неоднозначность и здесь являетесь моим объяснением. Для записи я повернул свой downvote в upvote, потому что я соглашаюсь с Вашим текущим ответом. – rahmu 25.08.2012, 16:30\n
в имени каталога Вы не можете использовать сокращение для получения его (который является тем, что Вы делали когда я downvoted Вы). Существует немного случаев гдеls
не ведет себя опасно, и почти всегда более безопасно использовать иначе. – rahmu 25.08.2012, 20:17