stdinでテキストを読み取る - EOFを使用したときのあいまいなリダイレクトエラー

stdinでテキストを読み取る - EOFを使用したときのあいまいなリダイレクトエラー

以下を使用して、文字列リテラルを標準入力として読み取ろうとします。

#!/usr/bin/env bash

set -e;

gmx --stdin < `cat <<EOF
   node e "console.log('foo')"
EOF`

これを実行すると、次のエラーが発生します。

simple.sh: line 5: `cat <<EOF
   node e "console.log('foo')"
EOF`: ambiguous redirect

バックティックを取り除くと

 gmx --stdin < cat <<EOF
       node e "console.log('foo')"
 EOF

次のエラーが発生します。

/simple.sh: line 5: cat: No such file or directory

誰もが問題を解決する方法を知っていますか?私が何をしたいのかわからない場合は、gmxプロセスの標準入力として文字列リテラルを読みたいだけです。

私もこれを試しました:

gmx --stdin <<<  node e "console.log('foo')"

しかし、これはうまくいかないようです。ノードコマンドを引用符で囲む必要があるようです。これは私がやろうとしている仕事の目的を崩します。コマンドにシェル変数を含めたい。 HEREDOCは、「文字をエスケープする必要がないので良いです。

ベストアンサー1

オリジナル:

<ファイルまたはファイル記述子が必要で、バックティックをテキスト文字列に置き換えるコマンド置換があります。

あなたの目的のために使用することをお勧めしますプロセスの交換存在するbash。このように:

gmx --stdin < <(node e "console.log('foo')")

または明確にするために別の例を見てみましょう。

wc -l < <(df)

編集する:

コマンドを表す文字列リテラルを渡すには、次のようにします。

gmx --stdin <<< "$(echo node -e $'"console.log(\'foo\')"' )"

C参照が許可されています$'...'。これが\'foo\'セクションで行うことです。

これは基本的に同じ例ですが、代わりにパイプを使用します(コマンドに必要な場合)。検索可能入力する)

$ touch with\ space
$ echo stat $'\'with space\''
stat 'with space'
$ echo stat $'\'with space\'' | sh
  File: with space
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d  Inode: 1069455     Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/     xie)   Gid: ( 1000/     xie)
Access: 2018-05-07 05:01:37.638553045 +0800
Modify: 2018-05-07 05:01:37.638553045 +0800
Change: 2018-05-07 05:01:37.638553045 +0800
 Birth: -

printf %qまた、次のように参照を介して処理する方法もありますhelp printf

シェル入力で再利用できる方法で引数を引用

したがって、潜在的な解決策は次のとおりです。

printf '%q'  'node -e "conlose.log('foo')"' | gmx --stdin

または

gmx --stdin <<< "$( printf '%q'  'node -e "conlose.log('foo')"' )"

おすすめ記事