2012-03-29 13 views
0

psコマンドの出力をファイルに出力し、そのファイルを使用してラジオリストを作成しようとしています。これまで私は問題を抱えています。コマンドを実行する代わりに変数に保存する

これまでのところ、しばらくは2つの変数に列を分割しませ読み取りん( $pidが全体のラインで、 $commandが空白です)が、私はこれを実行しようとすると、スクリプトのようにラインを実行しようとしているだけでなく、
eval "ps -o pid,command">/tmp/process$$ 
more /tmp/process$$ 
sed -e '1d' /tmp/process$$ > /tmp/process2$$ 
    while IFS= read -r pid command 
    do 
     msgboxlist="$msgboxlist" $($pid) $($command) "off" 
    done</tmp/process2$$ 
    height=`wc -l "/tmp/process$$" | awk '{print $1}'` 
    width=`wc --max-line-length "/tmp/process$$" | awk '{print $1}'` 
    echo $height $width 
    dialog \ 
     --title "Directory Listing" \ 
     --radiolist "Select process to terminate" "$msgboxlist" $(($height+7)) $(($width+4)) 

コマンド。たとえば:

+ read -r pid command 
++ 7934 bash -x assessment.ba 
assessment.ba: line 322: 7934: command not found 
+ msgboxlist= 
+ off 
assessment.ba: line 322: off: command not found 

は基本的に私は、私は引用符、二重引用符やバックスラッシュを置くことになってる見当がつかない。それは私を野生に追いやっている。

tl; drコマンドを実行せずに変数に保存する方法は?

+2

[してください](http://mywiki.wooledge.org/BashFAQ/048)[検討](http://mywiki.wooledge.org/ProcessManagement)あなたがしていること(http:// www .grymoire.com/Unix/Quote.html)。そのコードは恐ろしいです! [Code Review](http://codereview.stackexchange.com/)に投稿したいかもしれません。 – l0b0

答えて

0

私はあなたがしていることについて100%明確ではないことを認めなければなりません。これに

 msgboxlist="$msgboxlist" $($pid) $($command) "off" 

msgboxlistという名前の配列には3つの新しい要素としてPID、コマンド、および「オフ」を追加します

 msgboxlist+=("$pid" "$command" off) 

が、私はあなたがこれを変更したいと思います。その後、dialogコマンドで"$msgboxlist""${msgboxlist[@]}"に変更し、コマンドの引数としてこれらの要素をすべて含めるようにします。

1

あなたはコマンドとして$pid$commandを実行しようとしている:

msgboxlist="$msgboxlist" $($pid) $($command) "off" 

試してみてください。

msgboxlist="$msgboxlist $pid $command off" 

または配列を使用します。

msgboxlist=() # do this before the while loop 
msgboxlist+=($pid $command "off") 

# when you need to use the whole list: 
echo "${msgboxlist[@]}" 
1

をあなたのスクリプトがでリファクタリングすることができます次のような不必要なコールを削除します:

ps -o pid=,command= > /tmp/process$$ 
msgboxlist="" 
while read -r pid command 
do 
    msgboxlist="$msgboxlist $pid $command off" 
done < /tmp/process2$$ 

height=$(awk 'END {print NR}' "/tmp/process$$") 

width=$(awk '{if (l<length($0)) l=length($0)} END{print l}' "/tmp/process$$") 

dialog --title "Directory Listing" \ 
    --radiolist "Select process to terminate" "$msgboxlist" $(($height+7)) $(($width+4)) 
+0

良いリファクタリング。私は実際に今の意図を理解することができます。:awk 'length($ 0)> l {l = length($ 0)} END {print l}' ' – ghoti

0

変数を展開する場合は二重引用符を使用します。変数の展開を無効にするには、一重引用符を使用します。

これは、後で実行するために保存されたコマンドの例です。読み取りをadressing

file="readme.txt" 
cmd="ls $file" # $file is expanded to readme.txt 
echo "$cmd" # ls readme.txt 
$cmd # lists readme.txt 

編集:読んで使用して

は、一般的に行全体を読み込みます。代わりに、このことを考えてみましょう(テスト):

ps o pid=,command= | while read line ; do 
    set $line 
    pid=$1 
    command=$2 
    echo $pid $command 
done 

はまた、表示ヘッダをスキップする「コマンド=をPS 0 PID =」の異なる使用を注意してください。

+1

' eval $は必要ありません: cmd'を実行すると、 '$ cmd'はうまく展開してコマンドを実行します。 – Daenyth

関連する問題