Мне хорошо известно утилита source
(aka .
), которая выведет содержимое из файла и выполнит его в текущей оболочке.
Теперь я преобразую текст в команды оболочки, а затем запускаю их следующим образом:
$ ls | sed ... | sh
ls
- это просто случайный пример, исходный текст может быть любым. sed
тоже, просто пример преобразования текста. Интересный бит - sh
. Я передаю все, что попал в sh
, и он запускает его.
Моя проблема заключается в том, что это означает запуск новой суб-оболочки. Я бы предпочел, чтобы команды выполнялись в моей текущей оболочке. Как я мог бы сделать с source some-file
, если бы у меня были команды в текстовом файле.
Я не хочу создавать временный файл, потому что чувствую себя грязным.
В качестве альтернативы, я хотел бы запустить свою подклассу с теми же характеристиками, что и моя текущая оболочка.
Обновление
Хорошо, решения, использующие backtick, безусловно, работают, но мне часто нужно это делать, пока я проверяю и изменяю вывод, поэтому я бы предпочел, чтобы в конце концов был способ передать результат.
печатное обновление
А, вещь /dev/stdin
выглядела настолько красивой, но в более сложном случае она не работала.
Итак, у меня есть это:
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
Итак, когда я запускаю первый, он сразу выйдет, ничего не происходит.