Мне хорошо source
известна .
утилита (также известная как ), которая берет содержимое из файла и выполняет его в текущей оболочке.
Теперь я преобразую некоторый текст в команды оболочки, а затем запускаю их следующим образом:
$ ls | sed ... | sh
ls
это просто случайный пример, исходный текст может быть любым. sed
тоже просто пример преобразования текста. Интересный момент sh
. Я прокручиваю все, что у меня есть, sh
и оно работает.
Моя проблема в том, что это означает запуск новой вспомогательной оболочки. Я бы предпочел, чтобы команды выполнялись в моей текущей оболочке. Если бы у source some-file
меня были команды в текстовом файле, я бы смог это сделать .
Я не хочу создавать временный файл, потому что кажется грязным.
В качестве альтернативы я хотел бы запустить свою вспомогательную оболочку с теми же характеристиками, что и моя текущая оболочка.
Обновить
Хорошо, решения, использующие обратный апостроф, безусловно, работают, но мне часто приходится делать это, пока я проверяю и изменяю вывод, поэтому я бы предпочел, чтобы был способ передать результат во что-то в конце.
печальное обновление
Ах, /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
Итак, когда я запустил первый, он сразу выйдет, ничего не происходит.
Ответы:
$ ls | sed ... | source /dev/stdin
ОБНОВЛЕНИЕ: это работает в bash 4.0, а также в tcsh и dash (если вы перейдете
source
на.
). По-видимому, это было ошибкой в bash 3.2. Из примечаний к выпуску bash 4.0 :источник
eval "$(sed ...)"
подходом - но спасибо за предупреждение об ошибке 3.2!Команда
eval
существует именно для этого.eval "$( ls | sed... )"
Еще из руководства по bash :
источник
eval "$( ssh remote-host 'cat ~/.bash_profile' )"
Обратите внимание, что я действительно использую bash 3.2.Вау, я знаю, что это старый вопрос, но недавно я столкнулся с той же самой проблемой (вот как я сюда попал).
В любом случае - мне не нравится
source /dev/stdin
ответ, но я думаю, что нашел лучший. На самом деле это обманчиво просто:echo ls -la | xargs xargs
Красиво, правда? На самом деле это все равно не то, что вы хотите, потому что, если у вас есть несколько строк, он объединит их в одну команду вместо того, чтобы запускать каждую команду отдельно. Итак, решение, которое я нашел:
то
-L 1
опция означает, что вы используете (максимум) 1 строку для выполнения команды. Заметка: если ваша строка заканчивается конечным пробелом, она будет объединена со следующей строкой! Поэтому убедитесь, что каждая строка заканчивается пробелом.Наконец, вы можете сделать
чтобы увидеть, какие команды выполняются (-t подробно).
Надеюсь, кто-нибудь это прочитает!
источник
Попробуйте использовать подстановку процесса , которая заменяет вывод команды временным файлом, который затем можно получить:
source <(echo id)
источник
echo <(echo id)
, выполнив следующие действия: выдав результат/dev/fd/12
(пример 12)cat <(echo id)
, предоставив результатid
, а затемsource <(echo id)
выдав тот же результат, что и простая записьid
(...)
перенаправленная подоболочка ?Я считаю, что это «правильный ответ» на вопрос:
ls | sed ... | while read line; do $line; done
То есть можно соединиться в
while
петлю;read
команда команда занимает одну строку от ееstdin
и присваивает его переменной$line
.$line
затем становится командой, выполняемой в цикле; и продолжается до тех пор, пока в его вводе не останется новых строк.Это по-прежнему не будет работать с некоторыми управляющими структурами (например, с другим циклом), но в этом случае это отвечает всем требованиям.
источник
Я вроде чувствую , как
ls | sed ... | source -
бы красивее, но , к сожалению ,source
не понимает ,-
означаетstdin
.источник
Думаю, ваше решение - подстановка команд с обратными кавычками: http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html
См. Раздел 3.4.5.
источник
$( )
синтаксис может быть предпочтительнее. 'Курсовые обратные кавычки работают в большем количестве снарядов ...Чтобы использовать решение mark4o в bash 3.2 (macos), вместо конвейеров, как в этом примере, можно использовать строку here:
. /dev/stdin <<< "$(grep '^alias' ~/.profile)"
источник
Почему бы
source
тогда не использовать ?$ ls | sed ... > out.sh ; source out.sh
источник