我正在尝试实现一个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个。
答案 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列。由于第一列只是一堆单选按钮,因此您并不关心您为该列提供的值。它们可以是全部1
或x
或foo
或其他。当你选择一个单选按钮并点击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”