2016-08-12 9 views
0

のうち、外部プログラムのためのコマンドラインフラグを構築ファイルから読み込み、常に同じ長さになるわけではないので、以下のようなハードコーディングは機能しません)。私は例</p>(実際には、そのリストが固定されていない <pre><code>IGNORES=('post_install.sh' 'dummy') </code></pre> <p>ため、<code>stow</code>によって無視されるしたいファイル名の配列を持っているbashの配列

私はしかし、無視はストウで

stow -v "${IGNORES[@]}" -t $home $pkg 

を尊敬していないけど、それは無効な引数文句はありませんので、

IGNORES=("${IGNORES[@]/#/--ignore=\'}") 
IGNORES=("${IGNORES[@]/%/\'}") 

ような配列のうち、コマンドラインフラグを形成どちらか。直接書き込み

stow -v --ignore='post_install\.sh' --ignore='ignore' -t $home $pkg 

でも動作します。

--ignoreフラグを渡すこれらの2つの方法の違いは何ですか、問題を解決する方法はありますか?私の理解では、"${IGNORES[@]}"は、配列要素ごとに1ワードと評価し、意図した効果があるはずです(引用符を取り除き、配列を*でインデックスしようとしましたが、役に立たない)。

ありがとうございます!記事を書きながら

+0

'post_install.sh'の' .'をエスケープすることは不要ですが、ファイル名を引用符で囲まなければ無害です。引用符の中に、名前にリテラル・バックスラッシュを追加します。 – chepner

+0

それは私が確認する必要があるもう一つのことです。 'man stow'は名前がファイル名の末尾にマッチする必要があるperl正規表現として解釈されるので、正しいパターンを得るためにドットをエスケープする必要があると思います文字を含む文字ですが、それは本当に私が望むものではありません)。 – Wisperwind

+0

ああ、そうです。 – chepner

答えて

1

だから、私は解決策に出くわした:私はここに

IGNORES=("${IGNORES[@]/#/--ignore=\'}") 
IGNORES=("${IGNORES[@]/%/\'}") 

を追加した単一引用符は無視するファイル名の一部となり、実際に'ignore'という名前のファイルはスキップされます。やっているだけです

IGNORES=("${IGNORES[@]/#/--ignore=}") 

の効果があります。私はまだ、これは配列要素内のスペースに対処する方法を確認する必要がありますが、私の推測では、スペースで単語を引用する必要が唯一の

stow -v --ignore='the file' -t $home $pkg 

対のような言葉に、完全なコマンドラインを分割に由来するので、それだけで正常に動作していることですそして"${IGNORES[@]}"上記の問題ではありませんが

stow -v --ignore=the file -t $home $pkg 

はちょうど右の単語を取得します。

+0

配列要素の空白を保護するには、配列展開をクォートするのが正しい方法です。確かに、それは言語に配列を追加するための論理的根拠です。 – chepner

関連する問題

 関連する問題