1

tclファイルを使用してカスタムMOTDヘッダーを作成しようとしています。/ etc/profileの最後の行にコマンドを追加することにすでに成功しています

cowsay -f $(ls /usr/share/cowsay/cows/  | shuf -n1) $(whoami), $(fortune)

これを既存のMOTDに追加したいのですが、pipebreakコマンドなしで複数のコマンドを実行するための適切な構文がわかりません。以下に示すように、私は試しました:

#!/usr/bin/env tclsh

# * Variable
set cows [exec -- /usr/bin/whoami | /usr/games/fortune | cowsay]


# * Output

puts "$cows"

これは幸運とカウセイをうまく出力しますが、whoamiコマンドを他のコマンドで実行させることができないようです。

\   ^__^
 \  (oo)\_______
    (__)\       )\/\
        ||----w |
        ||     ||

tcl形式の構文内から複数のコマンドを実行する方法に関するヘルプをいただければ幸いです。ありがとうございます。

4

2 に答える 2

4

iagreenによる答えはもちろん正しく、おそらくより保守可能ですが、あなたのサブ質問に答えるために$(some command):tclに変換する方法:

bashでは、$(...)構文は、括弧で囲まれた文字列を別のシェルで評価することによって実行します。これは、サブシェルと呼ばれることが多いbashの新しいインスタンスです。

tclでは、execコマンドは、サブシェルで評価される単語のリストとして引数を実行します。

したがって、2つと2つを組み合わせると、の正しい翻訳は$(...)です[exec ...]

したがって、これの直接翻訳:

cowsay -f $(ls /usr/share/cowsay/cows/  | shuf -n1) $(whoami), $(fortune)

これは:

exec cowsay -f [exec ls /usr/share/cowsay/cows/ | shuf -n1] \
               [exec whoami], [exec fortune]

これは基本的にiagreenの答えと同じです。

于 2012-12-27T05:26:05.370 に答える
3

あなたのアプローチの問題は、幸運がstdinを無視することです。

カウセイに渡す文字列を作成しているようです。Tcl文字列を使用して文字列を分割して作成してみませんか。例えば、

#!/usr/bin/env tclsh

# * Variable
set cowsParam [exec /usr/bin/whoami]
append cowsParam ", " [exec /usr/games/fortune]
set cowImage [exec ls /usr/share/cowsay/cows/  | shuf -n1]
set cows [exec cowsay -f $cowImage $cowsParam]


# * Output

puts "$cows"
于 2012-12-27T02:44:54.987 に答える