Как выполнить вывод команды в текущей оболочке?
я хорошо осведомлен оsource
(ака.
) утилита, которая возьмет содержимое из файла и выполнит его в текущей оболочке.
Сейчас я'm преобразовывает некоторый текст в команды оболочки, а затем запускает их следующим образом:
$ ls | sed ... | sh
ls
это просто случайный пример, оригинальный текст может быть чем угодно.sed
тоже просто пример для преобразования текста. Интересный битsh
, Я трубку все, что я долженsh
и это работает.
Моя проблема в том, что это означает запуск новой вложенной оболочки. Я'Я предпочел бы, чтобы команды выполнялись в моей текущей оболочке. Как я мог бы сделать сsource some-file
Если бы у меня были команды в текстовом файле.
Я неЯ не хочу создавать временный файл, потому что чувствует себя грязным.
Или яЯ хотел бы запустить мой субоболочку с точно такими же характеристиками, что и мой текущий.
ОбновитьХорошо, решения, использующие backtick, безусловно, работают, но мне часто приходится делать это, пока яЯ проверяю и изменяю вывод, поэтому яЯ бы предпочел, если бы был способ передать результат во что-то в конце.
грустное обновлениеАх,/dev/stdin
вещь выглядела так красиво, но, в более сложном случае, это нет работа.
Итак, у меня есть это:
find . -type f -iname '*.doc' | ack -v '\.docКоторый обеспечивает все.doc
файлы имеют расширение в нижнем регистре.
И который, кстати, может быть обработан сxargs
, но это'суть не в этом.
find . -type f -iname '*.doc' | ack -v '\.docИтак, когда я запускаю первый, этоСразу выйду, ничего не происходит.
| perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin
Который обеспечивает все.doc
файлы имеют расширение в нижнем регистре.
И который, кстати, может быть обработан сxargs
, но это'суть не в этом.
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
Итак, когда я запускаю первый, этоСразу выйду, ничего не происходит.
| perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
Итак, когда я запускаю первый, этоСразу выйду, ничего не происходит.
| perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdinКоторый обеспечивает все.doc
файлы имеют расширение в нижнем регистре.
И который, кстати, может быть обработан сxargs
, но это'суть не в этом.
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
Итак, когда я запускаю первый, этоСразу выйду, ничего не происходит.