2011-01-12 4 views
18

bash関数の引数としてhereドキュメントを渡すことはできますか?その関数では、複数行の変数として保存されていますか?ここでは、bash関数の引数としてのドキュメント

次線に沿って何か:私はここに私が実行するコマンドとしてsshをするフィードすることを文書化しており、sshセッションがある

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

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

printArgs 17 <<EOF 
18 
19 
EOF 

または多分にbash関数から呼び出されます。

答えて

5

あなたが標準吸収するものを使用していない場合入力すると、それを行うものを提供する必要があります:

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

ちょうどFYI。 "while"で反復するのではなく、関数内で "cat/dev/stdin"を実行することもできます – joeb

+1

@joeb:ちょうど普通の 'cat' wi l ll workです。 –

+0

doh。もちろんそれはそうです。いいキャッチ! – joeb

13

ことが可能であることへの道は、次のとおりです。

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

しかし、なぜあなたはこのためにヒアドキュメントを使用したいのでしょうか?

print Args 17 "18 
19" 

はそれを作るために優れていることを覚えておいてください:あなたは、ファイルの内容を取得するためにcatを使用(AB)に持っているので、ヒアドキュメントを引数にファイルとして扱われ、その理由だけのような何かをしませんあなたがsshにしたいマシン上のスクリプトを実行し、それを実行して、bashが複数行引数で変数などを展開するので、このようなハッキングを試してみてください。ここではドキュメントおよび関数を使用してsshをするためのコマンドを養うために

+1

はたぶんEOF'と '("? ​​' –

+0

私はEmacsがバッチモードで評価するために、大きな醜いフォームを通過したい。これは、このための完全なユースケースである『'の間に改行があるはずです。ハック』 –

+0

と数か月後には、TinySchemeバッチプロセッサでGIMPを評価するために、醜いフォームを渡す必要があります。<3 –

1

一つの方法は、ほどです:

#!/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 

結果:

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

あなたが望むものを正確に行うことができます。これは、コマンドの引数に標準入力(予告-0は改行を維持することができます)

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

を変換しかし、あなたの特別な場合のために、私はあなたがSSHの標準入力でコマンドを送信することをお勧め:

$ ssh host <<EOF 
ls 
EOF 
+1

'xargs'は' execve() 'を使用しているので、シェル関数を呼び出すことはできません。したがって、問題の「bash関数」の制約が関係します。通常のコマンドでテストすることはできません。 –

+0

@CharlesDuffyいいえキャッチ – Jezz

3

ビルNedの答えでは、私の解は関数がその引数を引数リストまたはheredocとして受け取るようにします。

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

だから、あなたは、単一のコマンドや複数のコマンドのための長い形式のための最初の形式を使用することができ、この

printArgs uname 

またはこの

printArgs << EOF 
uname 
uptime 
EOF 

を行うことができます。

+0

かわいい。すごくかわいい。 –

関連する問題