Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 具有多行的zenity输入文件_Bash_Input_Line_Cat_Zenity - Fatal编程技术网

Bash 具有多行的zenity输入文件

Bash 具有多行的zenity输入文件,bash,input,line,cat,zenity,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" \

我对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="/ ")
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="/ ")
这里发生了一些非常奇怪的事情,我不明白。zenity中创建了7个字段中的4个:AAA CCC EEE和GGG。但不是其他的。当我设置-x进行调试时,我可以看到所有7行都被传输到zenity。。。发生了什么事

我尝试了另一种解决方案,列出了我当前文件夹中的7个子文件夹(它们恰好与tmp3中的行具有完全相同的名称)。同样的事情也会发生

我写道:

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="/ ")
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="/ ")
第二个解决方案似乎更简单,但我的技能不是很高。我想了解后一种解决方案,以及它为什么会这样做

谢谢你们

编辑: 我已经找到了这个,并试图让它工作我的方式,但没有成功到目前为止。。。
在《人类文明》中有一个有趣的例子:

zenity \
    --list \
    --checklist \
    --column "Buy" \
    --column "Item" \
    TRUE Apples \
    TRUE Oranges \
    FALSE Pears \
    FALSE Toothpaste
你只需要打开一个神经元来适应它一点=)

编辑

如果您有一个未定义的长度列表,此示例将更有趣:

find . -name '*.h' |
zenity \
    --list \
    --title "Search Results" \
    --text "Finding all header files.." \
    --column "Files"
零件
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

实现这一点的一个方法是
--列“Playlists”$(sed s/^/FALSE\/tmp3)\

我知道我有点晚了,但我也想要同样的东西,并最终找到了答案。 我的解决方案执行搜索(隐藏错误),为每个结果添加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的字符串以添加任意数量的列。

简而言之,您有两个选项:

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

而不是

cat tmp3 | zenity ... ...
cat tmp3 | zenity ... ...
做:

选项二:内联命令,列从命令args成对读取

而不是

cat tmp3 | zenity ... ...
cat tmp3 | zenity ... ...
做:


我已经看到了,不知道这和我有什么关系。是的,我在使用清单,但这个例子有一个已知的列数。我不知道。这就是为什么我要将tmp3文件传输到zenityAFAIK,您不能同时使用
--checkbox
和未定义的列表长度!谢谢你的新例子,我让它工作了,但我最终遇到了与我的例子2和3相同的问题。现在我的zenity清单中只有3行:BBB CCC和DDD。我写了这个“发现”-键入d-maxdepth 1-mindepth 1 | zenity--list \--列“Playlists”`您需要将每个文件显示在换行符上,以将其传送到
zenity
。请看
man ls
对不起,我想我不明白你的意思。何时需要使用ls工具?如果你的意思是在tmp3中,是的,它们都在不同的行上(如果重要的话,每行末尾没有空格)。请你说清楚一点好吗?