Я добре знаю програму source
(вона ж .
), яка бере вміст із файлу та виконує його в поточній оболонці.
Тепер я перетворюю деякий текст у команди оболонки, а потім запускаю їх наступним чином:
$ 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
Отже, коли я запускаю перший, він відразу вийде, нічого не трапиться.