2011-01-12 14 views
18

Czy można przekazać tutaj dokument jako argument funkcji bash, i czy w funkcji zapisano parametr jako zmienną wielowątkową?Tutaj dokument jako argument funkcji bash

Coś wzdłuż następujących linii:

function printArgs { 
echo arg1="$1" 
echo -n arg2= 
cat <<EOF 
$2 
EOF 
} 

printArgs 17 <<EOF 
18 
19 
EOF 

czy może:

printArgs 17 $(cat <<EOF 
18 
19 
EOF) 

mam tutaj dokument, który chcę karmić ssh jako polecenia do wykonania, a sesja ssh jest wywoływana z funkcji bash.

Odpowiedz

5

Jeśli nie używasz coś, co pochłonie norma wejściowego, a następnie trzeba będzie dostarczyć coś, co robi to:

$ foo() { while read -r line; do var+=$line; done; } 
$ foo <<EOF 
a 
b 
c 
EOF 
+1

Tylko FYI. Możesz także zrobić "cat/dev/stdin" w funkcji zamiast iterować z "while" – joeb

+1

@joeb: Po prostu "cat' wi l l pracy. –

+0

doh. Oczywiście, że tak. Dobry połów! – joeb

13

Sposobem że byłoby możliwe jest:

printArgs 17 "$(cat <<EOF 
18 
19 
EOF 
)" 

Ale dlaczego chcesz użyć heredoc do tego? heredoc jest traktowany jako plik w argumentach więc trzeba (ab) używać cat aby uzyskać zawartość pliku, dlaczego nie po prostu zrobić coś takiego:

print Args 17 "18 
19" 

Proszę pamiętać, że lepiej jest, aby skrypt na komputerze, do którego chcesz ssh, i uruchom go, a następnie wypróbuj takie hakowanie, ponieważ bash nadal będzie rozszerzał zmienne i takie w twoim argumencie wielowierszowym.

+1

Być może powinien istnieć znak nowej linii między 'EOF' i' ("?? –

+0

Chcę przekazać wielką, brzydką postać, którą Emacs ma ocenić w trybie wsadowym, jest to idealny przypadek użycia dla tego" hacka ". –

+0

miesiące później muszę przekazać GMLowi wielką paskudną formę do oceny w procesorze wsadowym TinyScheme.Wygląda na to, że ciągle nadchodzi <3 –

1

Jednym ze sposobów podawania poleceń ssh poprzez tutaj doc i funkcji jest tak:

#!/bin/sh 
# define the function 
printArgs() { 
echo "$1" 
ssh -T remotehost 
} 
# call it with a here document supplying its standard input 
printArgs 17 <<EOF 
uname 
uptime 
EOF 

Wyniki:

17 
Linux remotehost 2.6.32-5-686 ... 
Last login: ... 
No mail. 
Linux 
16:46:50 up 4 days, 17:31, 0 users, load average: 0.06, 0.04, 0.01 
0

xargs s mógł zrobić dokładnie to, co chcesz. Konwertować standardowe wejście do argumentu dla polecenia (Zawiadomienie -0 pozwalają zachować newlines)

$ xargs -0 <<EOF printArgs 17 
18 
19 
EOF 

ale dla ciebie szczególny przypadek, proponujemy wysłać polecenie na standardowe wejście ssh:

$ ssh host <<EOF 
ls 
EOF 
+1

'xargs' nie może wywołać funkcji powłoki, ponieważ używa' execve() '. Tak więc istotne znaczenie ma ograniczenie "bash function" w pytaniu - testowanie za pomocą zwykłych poleceń nie będzie możliwe. –

+0

@CharlesDuffy Dobry połów – Jezz

3

Building w odpowiedzi Neda, moje rozwiązanie pozwala funkcji przyjmować jej dane wejściowe jako listę argumentów lub jako heredoc.

printArgs() (
    [[ $# -gt 0 ]] && exec <<< $* 
    ssh -T remotehost 
) 

Więc można to zrobić

printArgs uname 

czy to

printArgs << EOF 
uname 
uptime 
EOF 

Więc można użyć pierwszego formularza dla pojedynczych poleceń i długiej formy dla wielu poleceń.

+0

Ładny. Bardzo, bardzo słodki. –

Powiązane problemy