以下を使用して、文字列リテラルを標準入力として読み取ろうとします。
#!/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')"' )"