임의의 스크립트(예: JavaScript 애플리케이션)를 실행하고 스크립트 출력을 다른 애플리케이션(내 IDE)에서 파일로 열 수 있도록 ZSH 스크립트를 작성하려고 합니다. 여기서 내 생각은 그것을 이라고 부르는 것입니다 ./myscript.sh $(node main.js)
. myscript.sh
현재 콘텐츠:
#!/bin/zsh
TEMPFILE=$(mktemp /tmp/atom.XXXX)
echo $1 > $TEMPFILE
ide --file=$TEMPFILE
라인에 문제가 있습니다 echo
. 애플리케이션의 출력은 토큰이므로 다양한 공백, 백틱, 작은따옴표, 큰따옴표, 영숫자 문자, 기호 및 줄 바꿈을 포함합니다.
나는 이러한 문제가 애플리케이션 출력의 백틱 및 따옴표 종류와 관련이 있다는 것을 이해합니다. 일부 더미 출력:
# Weightlifting Workout A
Bodyweight: 165
| Lift | ||| 1RM (lb) |
|---| ---:|---:|---:| :-- |
|**Squats**|100x5<br>*0.61xBW*|90x6<br>*0.55xBW*|80x8<br>*0.48xBW*|112.5 |
|**Deadlift**|250x2<br>*1.52xBW*|||257.1 |
내 생각에 해결책은 뭔가를 감싸야 한다는 것인데 $1
, 그게 무엇인지는 잘 모르겠습니다. JavaScript 출력의 줄바꿈 echo
과
./myscript.sh $(node main.js)
나는 , , ./myscript.sh "node main.js"
의 조합을 시도했습니다./myscript.sh "$(node main.js)"
echo $1 > file
등 으로echo $($1) > file
애플리케이션의 출력을 zsh 매개변수로 전달하거나 애플리케이션 이름을 zsh 매개변수로 전달한 다음 애플리케이션 이름으로 zsh 스크립트를 실행해 보세요.
"명령을 찾을 수 없음: node main.js" 또는 "명령을 찾을 수 없음: #" 또는 이와 유사한 오류가 발생하지 않고는 이 작업을 수행하는 방법을 알 수 없습니다.
답변1
할 수 있어요:
#! /bin/zsh -
TMPPREFIX=${TMPDIR:-/tmp}/atom.
(){ide --file=$1} =(print -r -- "$@")
다음과 같이 호출하세요.
that-script "$(cmd)"
따옴표가 필요합니다. 그렇지 않으면 쉘이 출력을 문자 $cmd
단위 로 분할합니다 $IFS
. 이는 NL, SPC, TAB 및 NUL(기본값 $IFS
)에서만 작동하며 인용 문자, 백틱 표시 등은 문제가 되지 않습니다.
그러나 이는 직접 수행하는 것보다 더 많은 타이핑 작업을 수행합니다.
ide --file =(cmd)
또는 ide --file=file
교체 해야 하는 경우 ide --file file
:
(){ide --file=$1} =(cmd)
=(cmd)
파이프(용) 대신 임시 파일을 사용하는 zsh 관련 프로세스 대체입니다 <(...)
. (){code} args
익명 함수입니다.
$1
다음에 개행 문자가 오는 것을 출력하려면 구문은 다음과 같습니다.
printf '%s\n' "$1" # POSIX
print -r -- "$1" # ksh/zsh
echo -E - $1 # zsh only
백슬래시나 , ... 등을 포함하면 Not이 echo $1
제대로 작동하지 않습니다 .$1
-n
-
-Enenne
왜 printf가 echo보다 나은가요?더 알아보기.
답변2
스크립트가 수정되었습니다:
#!/bin/sh
TEMPFILE=$(mktemp /tmp/atom.XXXX)
cat >"$TEMPFILE"
ide --file="$TEMPFILE"
다음과 같이 사용할 수 있습니다.
node main.js | ./myscript.sh
그러면 명령의 출력이 node
스크립트의 표준 입력으로 파이프됩니다. 그런 다음 스크립트는 표준 입력을 임시 파일로 리디렉션합니다.
또는,
#!/bin/sh
TEMPFILE=$(mktemp /tmp/atom.XXXX)
printf '%s\n' "$1" >"$TEMPFILE"
ide --file="$TEMPFILE"
스크립트를 다음과 같이 사용하십시오.
./myscript "$( node main.js )"
(큰따옴표 사용에 유의하세요 printf
.)
위의 예에서는 그 방법으로 전환했다는 것을 알고 있지만 /bin/sh
특별한 고급 기능을 사용하고 있지 않은 것 같으니 zsh
그렇게 하면 충분할 것 같습니다.
관련된: