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