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より優れているのですか?もっと学ぶ。

おすすめ記事