私はそれを使用していますこの方法Gnomeターミナルウィンドウを開き、次のコマンドを実行します。この場合、簡単な通知メッセージを送信します(予約済みat
)。
#!/bin/sh
gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash'
シェルはremember:
文字列だけを印刷し、remind.sh "pick up the package"
またはを実行したときなど、私が指定した値は印刷しませんremind.sh "buy groceries X and Y"
。
スクリプトをコアまで削除すると、すべてが期待どおりに機能します(もちろん、前景には何も表示されないため、cronまたはsystemdによる自動化には役に立ちません)。
#!/bin/sh
echo "remember: $1"
答え1
分析する
gnome-terminal
あなた(またはあなたの場合)が提供するコードは、/bin/sh -c
コードの後に提供されている位置パラメータを見ることができます。たとえば、
gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash' zeroth first second …
印刷されますremember: first
。
コードの後に何も指定しないと、$1
コードが最終的に解釈されると空の文字列に展開されます(何かが異なりますが、ここでは重要ではありません)。それがあなたがそれを得る理由です。 run byは、明示的に渡さない限り、基本スクリプトの位置引数について何も知りません。$2
$3
$0
remember:
/bin/sh
gnome-terminal
解決策
内部コードの位置パラメータをスクリプトの位置パラメータで埋めるには、次の"$@"
代わりに使用しますfirst second …
。
gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash' sh "$@"
欲しいものは何でも通過できます。ここではすべての引数を渡しますが(すべての位置引数"$@"
に展開します)、通常は次のものを使用できます"$1"
(内部コードが最初の引数を知りたい場合)ただ)または"$2"
(内部コードを表示するには第二基本スクリプトの位置パラメータは次のとおりです。それ $1
)。
ノート
sh
0番目のパラメータは次のように記述されます。の2番目のshは何ですかsh -c 'some shell code' sh
?元のスクリプト(つまり、変更なし)で提供したいシェルコードが
sh -c
二重引用符で囲まれている場合、シェルで解釈されたスクリプトが拡張され、$1
結果が内部コードに含まれます。しかし、これをしないでください。#バギー
GNOME端末 - /bin/sh -c "echo 'remember: $1'; exec bash"ほとんどの場合、これは期待どおりに機能しますが、通常はそうではありません。一般に、欠点は次のとおりです。含める
{}
。一重引用符コードの後にパラメータが続くのが正しいアプローチです。コードを一重引用符で囲むと、そのまま動作します
/bin/sh -c
(内部二重引用符は重要ではありません。)。これにより、sh
コードが次のように表示されます。echo "remember: $1"; exec bash
そして二重引用符が良い
$1
ここで。