zenity的列表大小有限吗?

时间:2014-03-18 20:38:30

标签: bash shell zenity

我正在尝试实现一个zenity radiolist,它显示从find命令返回的所有目录。我正在使用一个79目录的路径来测试我的命令。当我输入命令时:

dir="/media/multiMediaA_intHdA720Gb/music/rockNextGen/lighter" ; artDir=$(find "$dir"  -maxdepth 1 -type d | sort | wc -l) ; echo "$artDir"

我得到79的预期输出(发现目录)。但是,当我通过zenity管道时,如:

dir="/media/multiMediaA_intHdA720Gb/music/rockNextGen/lighter" ; artDir=$(find "$dir"  -maxdepth 1 -type d | sort | zenity --list --title "All albums : selected band" --text "Enter the band you want to listen to:" --column "Select" --column "Artist" --radiolist --height 900 --width 200) ; echo "$artDir"

我按照预期获得了一个zenity radiolist窗口,但是只列出了79个(〜一半)dir中的39个。

我搜索了可能的zenity列表大小限制,但想出了nadda。有没有人知道zenity确实存在这样的限制,或者我可能做错了什么,或者zenity调用中省略了一个选项?

更多详情

有趣的是,如果我管道通过yad而不是zenity,返回的结果是40而不是39,所以仍然只有一半的dirs。如果我选择一个不同的路径,包括90个目录,zenity列表中只有44个,而yad列出45个。

2 个答案:

答案 0 :(得分:2)

我刚刚在我的盒子上试过seq 1 100 | zenity --list --column number,它显示了所有100个数字。我的zenity版本是3.8.0。

所以我猜你的剧本中正在发生其他事情。

更新:我想我可能已经知道发生了什么。您已经定义了两个列,因此我认为这意味着zenity期望随后的任何args(或者来自stdin的输入行)在<column 1 value> <column 2 value> <column 1 value> <column 2 value> ...形式中。例如,如果您有一个名为&#34; Name&#34;还有另一个名为&#34; Age&#34;的专栏,你可以这样做:

zenity --list --column Name --column Age Alice 25 Bob 40 Carol 37 ...

您已定义了两列但仅为一列提供了值。

更新2:我只是在我的盒子上玩了一下,我想你只需要添加一些虚拟值来填充第1列。由于第一列只是一堆单选按钮,因此您并不关心您为该列提供的值。它们可以是全部1xfoo或其他。当你选择一个单选按钮并点击OK时,zenity就会传回第2列的值,所以第1列的值完全没有意义。

我刚刚在我的盒子上做了这个,它按预期工作:

seq 1 100 | sed 's/^/x\n/g' | zenity --list --radiolist --column Select --column Number

也就是说,它显示了100行,第一列中带有单选按钮,标记为&#34;选择&#34;,第二列中的数字为1-100,标记为&#34;数字&#34;。< / p>

将此想法应用于您的命令,您将获得:

dir="/media/multiMediaA_intHdA720Gb/music/rockNextGen/lighter" ; artDir=$(find "$dir"  -maxdepth 1 -type d | sort | sed 's/^/x\n/g' | zenity --list --title "All albums : selected band" --text "Enter the band you want to listen to:" --column "Select" --column "Artist" --radiolist --height 900 --width 200) ; echo "$artDir"

尝试并告知我们是否有效。

答案 1 :(得分:0)

我使用以下选项来选择多个文件并删除前两个字符(句点和正斜杠),这样我就可以创建一个多输入文件列表作为变量列表$ LIST输入。

DIR = #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #include <sys/types.h> #include <sys/wait.h> int n; int a2b[2], b2c[2], c2a[2], x; void closeall(int* a, int* b, int* c) { close(a[0]); close(a[1]); close(b[0]); close(b[1]); close(c[0]); close(c[1]); } int passData(char* id, int in, int out, int x) { read(in, &n, sizeof(int)); printf("%s %d \n", id, n); // afisarea in plus pentru verificare if( n < 0 ) { printf ("WINNER is: %s %d\n ", id, n); return n; } n=n-x; printf("x= %d\n", x); // afisarea in plus pentru verificare write(out, &n, sizeof(int)); return n; } int main() { pipe(a2b); pipe(b2c); pipe(c2a); srand(time(NULL)); n=rand() % 1001 + 1000; x=0; write(c2a[1], &n, sizeof(int)); while (passData("A", c2a[0], a2b[1], x) > 0){ x=10; } if (fork() == 0){ if (fork() == 0){ while (passData("C", b2c[0], c2a[1], x) > 0){ x=30; } while (passData("B", a2b[0], b2c[1], x) > 0){ x=20; } wait(0); exit(0); } closeall(a2b, b2c,c2a); wait(0); wait(0); wait(0); return 0; }

LIST = $(找。-maxdepth 1 -type d | sort | sed -r's / ^。{2} // g'| zenity --list --title“选择文件” - 列“文件“--multiple --separator =”“ - high 900 --width 400); echo“$ LIST”