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

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

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

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

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

cat text.txt | ./Myscript.sh

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

решение1

Замена команды.

./Myscript.sh "$(cat text.txt)"

решение2

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

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

cat text.txt | xargs -I {} ./Myscript.sh {}

решение3

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

#!/bin/bash

declare -a A=("$@")
[[ -p /dev/stdin ]] && { \
    mapfile -t -O ${#A[@]} A; set -- "${A[@]}"; \
}

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

решение4

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

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt

Связанный контент