リダイレクト/パイプラインコマンドをスクリプトに保存して実行します。

リダイレクト/パイプラインコマンドをスクリプトに保存して実行します。

リダイレクトとパイプを使用してコマンドを保存し、後で実行する方法は? (私の問題の原因はパイプですか、リダイレクトですか、それとも両方ですか?)

スクリプトからurxvtバージョンを印刷し、実際のコマンドをエコーし​​てみました。

バージョンのインポートに使用するコマンドは次のとおりですurxvt -help 2>&1 | head -n 2。何らかの理由でurxvtはヘルプを印刷しますstderr。その理由は、head最初の2行にのみバージョンと構成データが含まれているためです。

シェルではうまく機能しますが、スクリプト(下に分離された問題)の3行目は意味を失ったようです。

#!/bin/bash

VER_URXVT='urxvt -help 2>&1 | head -n 2'
echo $VER_URXVT
$VER_URXVT

答え1

使用:

VER_URXVT=`urxvt -help 2>&1 | head -n 2`

同じ:

VER_URXVT=$(urxvt -help 2>&1 | head -n 2)

urxvtにヘルプの最初の2行を入力してくださいVER_URXVT

シェル変数のコマンドを評価するには、以下を使用する必要がありますeval

VER_URXVT='urxvt -help 2>&1 | head -n 2'
eval $VER_URXVT

答え2

私はいつもeval変数を使うよりも関数が良いと思いました。

#!/bin/bash

version() { uname -a;}
wm() { head -n1 <(openbox --version);}
for f in $(compgen -A function)
do declare -f $f | sed '1,2d; $d'
   $f
done

答え3

eval編集中の内容を実際に知らない限り、絶対に使用しないでくださいeval

代わりに関数を使用してください。

#!/bin/bash

ver_urxvt() { urxvt -help 2>&1 | head -n 2;}
declare -f ver_urxvt | sed '1,2d; $d'
ver_urxvt

しかし、この情報を印刷するのは時間の無駄なので、これは愚かです。

スクリプトをデバッグするには、組み込み-xオプションを使用してください。set

答え4

評価式を使用する必要があります。

#!/bin/bash

VER_URXVT='urxvt -help 2>&1 | head -n 2'
echo $VER_URXVT
eval $VER_URXVT

マニュアルページの評価

          The  args  are read and concatenated together into a single com-
          mand.  This command is then read and executed by the shell,  and
          its  exit status is returned as the value of eval.  If there are
          no args, or only null arguments, eval returns 0.

関連情報