Kann ich die Pipe-Ausgabe als Shell-Skriptargument verwenden?

Kann ich die Pipe-Ausgabe als Shell-Skriptargument verwenden?

Angenommen, ich habe ein Bash-Shell-Skript, Myscript.shdas aufgerufen wird und ein Argument als Eingabe benötigt.

Ich möchte aber, dass der Inhalt der aufgerufenen Textdatei text.txtdieses Argument ist.

Ich habe dies versucht, aber es funktioniert nicht:

cat text.txt | ./Myscript.sh

Gibt es eine Möglichkeit, dies zu tun?

Antwort1

Befehlsersetzung.

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

Antwort2

Sie können die Pipe-Ausgabe als Shell-Skriptargument verwenden.

Versuchen Sie diese Methode:

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

Antwort3

Um @bac0n zu vervollständigen, der meiner Meinung nach der Einzige ist, der die Frage richtig beantwortet, hier eine kurze Zeile, die Ihrer Liste der Skriptargumente die weitergeleiteten Argumente voranstellt:

#!/bin/bash

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

echo "$@"

Anwendungsbeispiel:

$ ./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

Antwort4

Wenn Sie mehr als einen Satz Argumente in der Datei haben (für mehrere Aufrufe), verwenden Siexargsoderparallel, z.B

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

verwandte Informationen