これは端末で直接実行されますが、うまく機能します。
zenity --info --text "pure info" --title "get info"
しかし、このスクリプトは機能しません。何が起こっているのでしょうか?
!/bin/bash
ZEN="--info --text \"pure info\" --title \"get info\""
zenity $ZEN
スクリプトは「テキストの情報とタイトルの「jeevan」を出力します。残りはスキップします。
二重引用符内のスペース(特殊文字)がその特別な意味を失うためですか?
ベストアンサー1
違いは、コマンドがzenity
最初のケースでは複数の引数を見ることができますが、2番目のケースでは1つの引数(多くのスペースを含む)しか表示できないことです。
次のawk
プログラムを使用すると、シェルが引数を拡張した内容をすばやく出力できます。問題が発生した場合は、zsh
問題を再現できます。
% awk 'BEGIN {for (i in ARGV) print "ARGV["i"] =", ARGV[i]}' $ZEN
ARGV[0] = awk
ARGV[1] = --info --text "pure info" --title "get info"
そしてbash
それは次のようになります(引用符付き文字列は単語に分割されています)。
$ awk 'BEGIN {for (i in ARGV) print "ARGV["i"] =", ARGV[i]}' $ZEN
ARGV[0] = awk
ARGV[1] = --info
ARGV[2] = --text
ARGV[3] = "pure
ARGV[4] = info"
ARGV[5] = --title
ARGV[6] = "get
ARGV[7] = info"
この動作を処理するシェルトークン化オプションが必要です。
しかしこれはうまくいきます:
set -- --info --text "pure info" --title "get info"
zenity "$@"
編集する:
シェルの単語分離機能は基本的に少し愚かです。bash
上記の例の動作を参照してください。"pure
とinfo"
2つの別々の単語。コマンドラインオプションを解析するときにこれは面倒なので、以下はマニュアルの特別なパラメータセクション"$@
で引用したものです。bash
@ Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" ...
一般的な変数拡張を特別に処理する方法が見つかりませんでしたが、トリックがある可能性が$@
あります。
このset
コマンドは位置パラメータ$1
、$2
...を設定します。したがって、位置引数の「すべて提供」バージョン$@
も使用できます。