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そうすれば十分です。

関連:

関連情報