変数拡張中に>(リダイレクト)に一重引用符を追加するbash(リダイレクトの中断)

変数拡張中に>(リダイレクト)に一重引用符を追加するbash(リダイレクトの中断)

調査した結果、これがbashスクリプトで可能かどうかはわかりません。私が見つけた最も可能性の高い原因はbashのシェル拡張シーケンスでした。 (おそらく?)

何が起こりたいのか、 >前の変数によるステートメントのリダイレクトを有効/無効にする機能()。

たとえば、以下のprintf出力は、>変数$SendGrafanaに含まれる内容に従ってリダイレクトする必要があります。
ただし、このサンプルコードは機能しません。

SendGrafana=" > /dev/tcp/192.168.1.242/5062"

awk -v vars="$vars" 'BEGIN{printf "output.api %s \n", vars;}' $SendGrafana

上記のコードは次のように動作したいと思います。

awk -v vars="$vars" 'BEGIN{printf "output.api %s \n", vars;}' > /dev/tcp/192.168.1.242/5062

- デバッグ用にset -xを使用してスクリプトを実行すると、リダイレクト(>)の周りにのみ単一引用符( ')が表示されます。これは私のnetcatスパイ聴覚デバイスには何も送信されないので問題だと思います。これは set -x を使用するときに読みやすさを高めるためのものだと読みましたが、問題は持続します。

set -xが有効な場合、関連する出力は次のようになります。

+ awk -v vars=3 'BEGIN{printf "output.api %s \n", vars;}' '>' /dev/tcp/192.168.1.242/5062

(参考「>」)

変数宣言と変数拡張の両方で多くのことを試しましたが、スクリプトを呼び出すと出力を192.168.1.242:5062にリダイレクトできませんでした。ありがとう


次のように編集されました - (質問を短くしようとしているので、私の意見にこの部分を追加しますが、提案はここにあるはずです):

$SendGrafanaさらにコンテキストを追加する:各awkステートメントの後に変数を使用せずにそのまま使用するのとは異なり、この変数を使用する理由は簡単に設定できるため、 > /dev/tcp/192.168.1.242/5062スクリプト$SendGrafana= " "は192.168.0に送信するのではなくSTDOUTに出力されます。 1.242 > /dev/tcp/192.168.1.242/5062)。新しいステートメントを追加するデバッグ/テスト中にSTDOUTへの出力のみが必要です。

ベストアンサー1

問題は実際に評価の順序です。

これは単にコマンドラインにテキストを置くことです。シェルがリダイレクトを実装するには遅すぎます。

paul $ j=" > foo.txt "
paul $ echo Words Here $j
Words Here > foo.txt
paul $ ls -l foo.txt
ls: cannot access 'foo.txt': No such file or directory

これにより、シェルはコマンド全体を再評価します。

paul $ eval echo Words Here $j
paul $ ls -l foo.txt
-rw-r--r-- 1 paul paul 11 Aug 19 22:38 foo.txt
paul $ cat foo.txt
Words Here
paul $ 

組み込みの試用版は正しく使用するのが難しいため、可能であれば使用しないでください。コマンドは2回(evalの引数として1回、eval自体によって1回)評価されるため、引用が困難で退屈になる可能性があります(特に、二重引用符と二重引用符が必要なawkが含まれている場合)。また、エラーが発生する可能性があります。変数がコマンドとして実行され、意図しない結果が発生します。詳しくはこちらをご覧ください。

unix.stackexchange.com/questions/278427/why-and-when-should-eval-use-be-avoided-in-shell-scripts

追加された例:

私が投稿したStackExchangeリンクの提案の1つは、シェルに新しいファイル記述子を作成して最初にターゲットに渡すことです。

これはやや誇張されたテストスクリプトです。

#! /bin/bash

#.. First arg to script is -l for test runs.

#.. For your live action.
Grafana="/dev/tcp/192.168.1.242/5062"

#.. For my demo here.
Grafana="./foo.txt"

rm -f foo.txt

if [[ "${1}" = "-l" ]]; then
    exec 7>&1
    shift 1
else
    exec 7>"${Grafana}"
fi  
 
vars="${@}" #.. Rest of args to output.

awk -v vars="$vars" 'BEGIN{printf "output.api %s \n", vars;}' 1>&7

ls -l foo.txt && cat foo.txt

テストするには、端末にログインし、名前付きファイル/デバイスにログインします。

Paul--) ./Swit -l Easy Living
output.api Easy Living 
ls: cannot access 'foo.txt': No such file or directory
Paul--) ./Swit Easy Living
-rw-r--r-- 1 paul paul 24 Aug 20 09:22 foo.txt
output.api Easy Living 
Paul--) 

fd 7を開いたままにして、スクリプトで複数回使用できます。次のコマンドでドラッグできますexec 7>&-

おすすめ記事