zenity输入文件有几行

时间:2013-02-19 22:31:51

标签: bash input line cat zenity

我有一个zenity的问题我无法解决。你能帮助我吗?

我有一个7行长的tmp3文件:

AAA
BBB
...
FFF
GGG

我想通过zenity发送这个文件,以便它显示一个清单,可以用我想要的每个组合来检查我想要的每一行。

我之前写过:

cat tmp3 | zenity --list \
                  --column='#' \
                  --text "Select playlist from the list below" \
                  --title "Please select one or more playlists" \
                  --multiple \
                  --width=300 \
                  --height=300 \
                  --checklist \
                  --column "Select" \
                  --separator="/ ")

所有这一切都是在zenity中用tmp3的所有7个文件创建一行。那不是我想要的。

我目前写道:

choice=$(zenity --list \
                --column "Playlists" FALSE $(cat tmp3) \
                --text "Select playlist from the list below" \
                --title "Please select one or more playlists" \
                --multiple \
                --width=300 \
                --height=300 \
                --checklist \
                --column "Select" \
                --separator="/ ")

这里真的很奇怪,我不明白。 7个字段中的4个以zenity创建:AAA CCC EEE和GGG。但不是其他的。当我设置-x进行调试时,我可以看到所有7行被管道传输到zenity ......发生了什么?????

我通过列出当前文件夹中的7个子文件夹尝试了另一种解决方案(它恰好与tmp3中的行完全相同)。同样的事情发生了!:

我写了这个:

choice=$(zenity --list \
                --column "Playlists" FALSE $(ls -d -1 */) \
                --text "Select playlist from the list below" \
                --title "Please select one or more playlists" \
                --multiple \
                --width=300 \
                --height=300 \
                --checklist \
                --column "Select" \
                --separator="/ ")

第二种解决方案似乎更容易,但我的技能不是很高。我想了解后一种解决方案以及为什么会这样做。

谢谢你们!

编辑: 我找到了这个并试图让它按照我的方式工作但到目前为止没有成功...... http://www.linuxquestions.org/questions/programming-9/reading-lines-to-an-array-and-generate-dynamic-zenity-list-881421/

5 个答案:

答案 0 :(得分:2)

部分FALSE $(cat tmp3)扩展为

FALSE AAA
BBB
CCC
DDD
EEE
FFF
GGG

您需要的是

FALSE AAA
FALSE BBB
FALSE CCC
FALSE DDD
FALSE EEE
FALSE FFF
FALSE GGG

实现此目标的一种方法是--column "Playlists" $(sed s/^/FALSE\ / tmp3) \

答案 1 :(得分:1)

我知道我有点晚了,但想要同样的事情,并最终弄清楚了。 我的解决方案进行搜索(隐藏错误),为每个结果添加TRUE和换行符(这是关键!),然后将结果发送到zenity:

CHECKED=`find /music/folder -name "*.mp3" -type f 2>/dev/null | \
         awk '{print "TRUE\n"$0}' | \
         zenity --list --checklist --separator='\n' --title="Select Results." \
                --text="Finding all MP3 files..." --column="" --column="Files"`

在你的情况下,我想这应该是:

CHECKED=`cat tmp3 | awk '{print "TRUE\n"$0}' | zenity --list --checklist \
         --separator='/ ' --title="Select Results." \
         --text="Finding all MP3 files..." --column="" --column="Select"`

所以似乎Zenity将每个换行符放在一个列中,并以这种方式填充列表。这意味着您可以操作进入Zenity的字符串以添加任意数量的列。

答案 2 :(得分:0)

man zenity中有一个有趣的例子:

zenity \
    --list \
    --checklist \
    --column "Buy" \
    --column "Item" \
    TRUE Apples \
    TRUE Oranges \
    FALSE Pears \
    FALSE Toothpaste

你只需打开一个神经元来适应它=)

you can do it

修改

如果你有一个未定义的长度列表,这个例子会更有趣:

find . -name '*.h' |
zenity \
    --list \
    --title "Search Results" \
    --text "Finding all header files.." \
    --column "Files"

答案 3 :(得分:0)

简而言之,您有两种选择:

选项一:输入文件,换行符分隔列

而不是

cat tmp3 | zenity ... ...

做的:

sed 's/^/.\n/' tmp3 | zenity ... ...

选项二:内联命令,colunms从命令args中读取为对

而不是

cat tmp3 | zenity ... ...

做的:

zenity ... ... `sed 's/^/. /' tmp3`

答案 4 :(得分:-1)

$ zenity --list --checklist --height 400 --text "Select playlist from the list below" --title "Please select one or more playlists" --column "Playlists" --column "Select" --separator="/ "  
$(ls -d -1 */ | xargs -L1 echo FALSE)