Можно ли использовать вывод канала в качестве аргумента сценария оболочки?

22

Предположим, у меня есть скрипт оболочки bash, Myscript.shкоторый требует ввода одного аргумента.

Но я хочу, чтобы содержание текстового файла вызывало text.txtэтот аргумент.

Я пробовал это, но это не работает:

cat text.txt | ./Myscript.sh

Есть ли способ сделать это?

Нарин
источник

Ответы:

19

Вы можете использовать вывод канала в качестве аргумента сценария оболочки.

Попробуйте этот метод:

cat text.txt | xargs -I {} ./Myscript.sh {}
zzart
источник
2

Если в файле более одной команды, рассмотрите возможность использования xargs или параллельного кода , например

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt
reinierpost
источник
0

Пытаться,

 $ cat comli.txt
 date
 who
 screen
 wget

 $ cat comli.sh
 #!/bin/bash
 which $1

 $ for i in `cat comli.txt` ; do ./comli.sh $i ; done

так что вы можете ввести значения по одному на comli.shиз comli.txt.

Ранджиткумар Т
источник
0

Читая stdin с mapfile, вы можете переустановить позиционные параметры.

#!/bin/bash

[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; }

for i in $@; do
    echo "$((++n)) $i"
done

(При цитировании «$ @» forвместо этого получаются строки цикла).

$ cat test.txt | ./script.sh
1 one
2 two
3 tree
bac0n
источник
0

Чтобы завершить @ bac0n, который IMHO является единственным, кто правильно ответит на вопрос, вот короткая строка, которая добавит переданные по конвейеру аргументы к вашему списку аргументов скрипта:

#!/bin/bash
args=$@
[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; set -- $@ $args; }

echo $@

Пример использования:

$ ./script.sh arg1 arg2 arg3
> arg1 arg2 arg3

$ echo "piped1 piped2 piped3" | ./script.sh
> piped1 piped2 piped3

$ echo "piped1 piped2 piped3" | ./script.sh arg1 arg2 arg3
> piped1 piped2 piped3 arg1 arg2 arg3
aznoqmous
источник