Powiązane z pytaniem, które zadałem na temat przepełnienia stosu: przekazanie wielu wierszy kodu do pliku wsadmin.sh? .
Mam jako ciąg kilka wierszy danych wejściowych, które muszę wprowadzić do polecenia. Komenda akceptuje jednak tylko plik pełen danych wejściowych.
Czy jest jakiś sposób, aby zapisać wiersze w tymczasowym pliku lub potoku, który nigdy nie jest zapisywany na dysku, a następnie podawany bezpośrednio do programu?
Jak mogę zdobyć rurę, wprowadzić do niej dane wejściowe, przekazać tę komendę do polecenia, a następnie pozbyć się rury?
linux
command-line
bash
ArtOfWarfare
źródło
źródło
Odpowiedzi:
Innym rozwiązaniem jest użycie procesu podstawiania w Bash. Jeśli twój system nazwał rury, możesz użyć tej funkcji.
Używa się go w następujący sposób:
gdzie
list
jest sekwencją poleceń powłoki (właściwie potoków; pełne szczegóły są tutaj ).list
zostanie wykonany, a jego wyjście zostanie podłączone do potoku. Nazwa potoku jest następnie przekazywana do Twojego programu.UWAGA: spacje nie są dozwolone między
<
a(
.(Inne podstawienie
>(list)
działa również tak, jak można się spodziewać).W twoim konkretnym przypadku możesz użyć
chociaż może się okazać, że rozwiązanie @ meuh jest bardziej eleganckie.
Aktualizacja: wiele przykładów użycia można znaleźć w przewodniku Advanced Bash Scripting Guide .
źródło
Możesz użyć bash tutaj-doc . Na przykład,
Jeśli masz coś w zmiennej bash, możesz ją również interpolować: np
<<<"path is $PATH"
.Jeśli twoje polecenie nalega na nazwę pliku, możesz go podać
/dev/stdin
. Na przykład:produkuje wyjście:
s/b/b/
.źródło
stdin
, nie jest jasne , a jeśli nie, to nie zadziała. Mam nadzieję, że PO wyjaśni."-f" option must be followed by a file name.
-f
nazwy pliku, podaj nazwę pliku/dev/stdin
. Zobacz moją edycję./dev/stdin
sugestię. Program, który próbuję wywołać, przyjmuje tylko nazwę pliku, więc połączyłem się/dev/stdin
z heredoc.W zależności od tego, co jest w scenariuszu, to może być w stanie użyć specjalnego pliku - (minus), który stoi na stdin
Inną metodą, która może Ci pomóc, jest otwarcie pliku,
/dev/fd/0
który znowu oznacza stdin .Trzecią opcją może być utworzenie FIFO (First In First Out). To jest jak plik, ale ma dwa końce - piszesz na jednym końcu, a czytasz na drugim.
źródło
-
ten sposób - nie jest to cecha powłoki ani systemu operacyjnego. Oczywiście, o ile wiem, większość standardowych narzędzi Linuksa stosuje się do tej konwencji.expect
.<()
rozwiązania, ale bardziej wyraźne - co może być bardzo przydatne!Istnieje inna opcja podobna do
mycmd -
rozwiązania, ale nawet w przypadku programów, które nie obsługują-
konkretnie:/dev/stdin
wydaje się być związany z systemem operacyjnym i działa dla mnie na Debian GNU / Linux, ale nie jestem pewien, gdzie jeszcze to zadziała.źródło
^D
?^D
jest powszechną notacją do naciskania Ctrl-D. ^ D ma tutaj semantykę „końca strumienia wejściowego”. Prawdopodobnie jest częściej widoczny w^C
lub^Z
który oznacza naciśnięcie Ctrl-C odpowiednio do naciśnięcia Ctrl-Z./dev/stdin
a następnie je zamknąć?cat content | mycmd /dev/stdin
. Wyobraź sobie inne polecenia niżcat
tutaj.