首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >quodlibet突然不接受文件列表,除非我手动键入它

quodlibet突然不接受文件列表,除非我手动键入它
EN

Stack Overflow用户
提问于 2015-12-29 02:47:36
回答 1查看 88关注 0票数 1

编辑:我不知道这个问题是否会得到解决,但它可能已经不再重要了。我也asked the quodlibet team for help了,他们的回应是立即修复程序,允许转义逗号,并告诉我~/.quodlibet/control file (这就是为我修复它的原因)。

因此,我正在运行一个命令,自动将一个文件列表放入quodlibet (一个音乐播放器):我已经在bash和fish中对其进行了测试。

代码语言:javascript
复制
quodlibet --enqueue-files="\"$(tail -n +2 $HOME/Dropbox/Playlists/queue | sed ':a;N;$!ba;s|\n|","|g')\""

而鱼的版本是:

代码语言:javascript
复制
quodlibet --enqueue-files=\"(tail -n +2 $HOME/Dropbox/Playlists/queue | sed ':a;N;$!ba;s|\n|","|g')\"

几个星期以来,我一直在愉快地使用这个bash命令,它一直工作得很好。然而,它突然停止了工作。这是最奇怪的部分。我有两台运行Arch Linux的计算机。有一款我会定期更新,台式机,还有一款我很久没有费心升级了,笔记本电脑。它有稍微老一点的quodlibet、bash和fish版本。我离开了一段时间,只带着我的笔记本电脑,并愉快地继续使用这个命令。但是,几天前,我没有升级或更改有关quodlibet、bash、fish、命令甚至整个系统的任何内容,它突然停止工作。我现在已经回到了升级后的桌面上,它现在也不能工作了,就好像整个问题都是基于系统时钟之类的。

那么,它到底是如何无法工作的呢?嗯,它什么也不做,也不输出任何输出。如果它工作了,它应该不会输出任何输出,但它不工作,而且似乎没有错误。但是,这就是它变得格外奇怪的地方。如果我把它分成两个命令,它实际上仍然工作得很好。如果我运行

代码语言:javascript
复制
echo "\"$(tail -n +2 $HOME/Dropbox/Playlists/queue | sed ':a;N;$!ba;s|\n|","|g')\""

然后将输出复制并粘贴到quodlibet --enqueue-file=中,它就可以工作了。

示例:假设文件$HOME/Dropbox/Playlists/queue中有3个音乐文件:

代码语言:javascript
复制
/home/jimi/Music/Song1.mp3
/home/jimi/Music/Song2.mp3
/home/jimi/Music/Song3.mp3

字符串"\"$(tail -n +2 $HOME/Dropbox/Playlists/queue | sed ':a;N;$!ba;s|\n|","|g')\"“计算结果为

代码语言:javascript
复制
"/home/jimi/Music/Song2.mp3","/home/jimi/Music/Song3.mp3"

(由于不同的命令,第一首歌曲开始播放,而不是进入队列。)如果我尝试将字符串"\"$(tail -n +2 $HOME/Dropbox/Playlists/queue | sed ':a;N;$!ba;s|\n|","|g')\"“排入队列,直到几天前,它都不起作用。但是,如果我手动粘贴"/home/jimi/Music/Song2.mp3","/home/jimi/Music/Song3.mp3",它就可以正常工作。我不知道为什么会这样。我已经做了一堆测试,试图弄清楚这一点,但一无所获。我做过的两个主要测试是尝试在鱼身上找到完全相同的行为,并尝试

代码语言:javascript
复制
quodlibet --enqueue-files=$(echo "\"$(tail -n +2 $HOME/Dropbox/Playlists/queue | sed ':a;N;$!ba;s|\n|","|g')\"")

因为它似乎非常喜欢echo的输出。但是,这两种方法都不起作用。总之,quodlibet已经决定只接受我自己手动输入的文件,尽管由于bash的工作方式,它应该无法判断我是否自己输入了这些文件。

编辑:新新闻:引文是问题的根源。如果我运行

代码语言:javascript
复制
quodlibet --enqueue-files="$(tail -n +2 $HOME/Dropbox/Playlists/queue | sed ':a;N;$!ba;s|\n|,|g')"

它起作用了。有什么关系呢?这个字符串避免了在sed字符串中包含任何引号。我知道它特别是sed引号(sed ':a;N;$!ba;s|\n|","|g'),因为我已经在没有其他引号的情况下对它进行了测试。不管怎么说,这句名言。当我移除它们时,它就起作用了。这不是一个可行的解决方案,因为为了使quodlibet不会曲解任何文件名中包含逗号的歌曲,我需要这些引号。我无法避开逗号--它不接受逗号。所以,我试了一下:

代码语言:javascript
复制
\"$(tail -n +2 $HOME/Dropbox/Playlists/queue | sed ':a;N;$!ba;s|\n|\",\"|g')\"

但这也不起作用!似乎quodlibet不会接受sed行中有引号的任何内容!当我尝试使用转义的单引号时,bash会给我一个换行符,就好像命令还没有键入完一样。

EN

回答 1

Stack Overflow用户

发布于 2015-12-29 03:53:35

我不认为你做得对。我不得不承认我不认识Fish,但是对于Bash来说,你所说的没有真正的意义。

当您粘贴"...“时,shell会剥离引号。见证者:

代码语言:javascript
复制
vnix$ printf '>>%s<<\n' "/home/jimi/Music/Song2.mp3","/home/jimi/Music/Song3.mp3"
>>/home/jimi/Music/Song2.mp3,/home/jimi/Music/Song3.mp3<<

如果你真的,真的想保留这些引号,你需要转义,或者以某种方式插入它们。也许是这样的:

代码语言:javascript
复制
vnix$ printf '>>%s<<\n' '"/home/jimi/Music/Song2.mp3","/home/jimi/Music/Song3.mp3"'
>>"/home/jimi/Music/Song2.mp3","/home/jimi/Music/Song3.mp3"<<

现在,单引号可以防止shell处理双引号,因此它们可以传递到printf命令的参数。

假设您确实希望Quod Libet看到每个文件名周围的文字引号,您可以像这样从文件中读取它们:

代码语言:javascript
复制
quodlibet --enqueue-files="$(sed '1d;:a;N;$!ba;s|\n|","|g;s/.*/"&"/' $HOME/Dropbox/Playlists/queue)"

(我擅自删除了tail,因为sed可以很好地删除第一行。)对printf进行同样的尝试,看看我们在这里得到了什么:

代码语言:javascript
复制
vnix$ printf '>>%s<<\n' quodlibet --enqueue-files="$(sed -e 1d \
    -e ':a' -e 'N' -e '$!ba' -e 's|\n|","|g' -e 's/.*/"&"/' quodlibet)"
>>quodlibet<<
>>--enqueue-files="/home/jimi/Music/Song2.mp3","/home/jimi/Music/Song3.mp3"<<

(我的冷酷的BSD sed似乎不喜欢跳转标签中的分号?)

shell去掉了外部的双引号,sed脚本现在提供了我们需要参数实际包含的所有文字引号。

我不相信这会奏效,但它应该会为你似乎在问的问题提供答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34498976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档