다음을 사용하여 문자열 리터럴을 표준 입력으로 읽으려고 합니다.
#!/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')"' )"
답변2
내가 해야 할 일은 다음과 같이 하는 것뿐이었습니다.
gmx --stdin <<EOF
node e "console.log('foo')"
EOF
node
문자열로 시작하는 행을 gmx 명령의 표준 입력으로 읽습니다.