ZSH: 출력에 개행 및 기타 특수 문자가 포함된 경우 프로그램의 출력을 임시 파일에 어떻게 에코합니까?

ZSH: 출력에 개행 및 기타 특수 문자가 포함된 경우 프로그램의 출력을 임시 파일에 어떻게 에코합니까?

임의의 스크립트(예: 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그렇게 하면 충분할 것 같습니다.

관련된:

관련 정보