我正在尝试将ps命令的输出输出到文件,然后使用该文件填充radiolist。到目前为止,我遇到了问题。
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))
到目前为止,while读取不仅没有将列拆分为2个变量($pid
是整行而$command
是空白的)但是当我尝试运行此脚本时,脚本正在尝试运行作为命令的行。例如:
+ 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将命令保存到变量中而不运行它,怎么做?
答案 0 :(得分: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 :(得分: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))
答案 2 :(得分:0)
我不得不承认,我并不是100%清楚你在做什么;但我想你想改变这个:
msgboxlist="$msgboxlist" $($pid) $($command) "off"
到此:
msgboxlist+=("$pid" "$command" off)
将把PID,命令和“off”作为三个新元素添加到名为msgboxlist
的数组中。然后,您可以在"$msgboxlist"
命令中将"${msgboxlist[@]}"
更改为dialog
,以包含所有这些元素作为命令的参数。
答案 3 :(得分:0)
如果要扩展变量,请使用双引号。使用单引号禁用变量扩展。
以下是为以后执行而保存的命令示例。
file="readme.txt"
cmd="ls $file" # $file is expanded to readme.txt
echo "$cmd" # ls readme.txt
$cmd # lists readme.txt
编辑地址阅读:
使用read通常会读取整行。改为考虑(测试):
ps o pid=,command= | while read line ; do
set $line
pid=$1
command=$2
echo $pid $command
done
另请注意'ps o pid =,command ='的不同用法,以跳过显示标题。