Bashで「単語」を拡張する方法は?ファイルワイルドカードに関する議論なし

Bashで「単語」を拡張する方法は?ファイルワイルドカードに関する議論なし

あまりにも簡単な質問で申し訳ありませんが、自分で解決策を見つけることができません。

私は走る:

$ echo {1..4}
1 2 3 4

それは私にとって問題ではありません。しかし、もし私が:

$ echo "{1..4}" > file

$ cat file
{1..4}

$ echo $(<file)
{1..4}

$ echo $(cat file)
{1..4}

{1..4}ファイル内で文字列を拡張するために使用できる方法を探していますが、成功しませんでした。fileecho

ベストアンサー1

作業に適したツールを使用していません。

[user@host dir]$ ksh
$ echo "{1..4}" > file
$ cat file
{1..4}
$ echo $(<file)
1 2 3 4
$ echo $(cat file)
1 2 3 4

冗談はさておき、Bashの拡張順序例:

  1. サポート拡張;
  2. チルダ拡張、パラメータおよび変数拡張、算術拡張、コマンドの置換(左から右へ)
  3. 噴射
  4. とファイル名拡張子。

したがって、echo $(cat file)(引用符なし)コマンド置換の出力はトークン化とファイル名拡張のみを経て、パターンマッチング文字が含まれていないため変更されたままになります(そして変数に、またはが含まれていIFSないと仮定)。{1.4}

一部の拡張はネストできますが、結果あるステップから現在のステップに拡張をトリガーする文字の場合、拡張文字は通常再解析されません。 (合理的な理由があります。考えてみてくださいfoo=\$foo; echo "$foo")。

中括弧拡張を適用するには、file新しいコマンドラインを設定し、シェルにその内容を解析して実行させる必要があります。一つの方法は図evalのようにこの他の答えあなたは持っています。あるいは、プロセス置換を使用することもできます。

$ . <(printf '%s ' echo; cat file)
1 2 3 4

どちらの場合も注意してください。の内容全体がfile解析され実行されます。現在の環境で。

同様ですが、新しいプロセスの別の環境で実行されますbash

$ bash <<<$( printf "%s " echo; cat file; )
1 2 3 4

しかし、ksh93(最初のコードブロックで使用されるシェル)はユニークな方法で動作します。中括弧拡張は、フィールド分割の一部として後のステップで実行され、前の拡張の結果は再解析されます。中かっこ式1 を検出するには:

$ bash -c 'echo {1..$(printf %s 3)}' mybash
{1..3}
$ ksh -c 'echo {1..$(printf %s 3)}' myksh
1 2 3

1 Stephen Chazeras 駅コメントで指摘した、ksh93のこれらの動作はバグと$var見なすことができますvar

おすすめ記事