使用命令的结果作为bash中的参数?
要为文件夹中的所有音乐创建播放列表,我在bash中使用以下命令:
ls > list.txt
我想将pwd(打印工作目录)命令的结果用作播放列表的名称。
就像是:
ls > ${pwd}.txt
那行不通,但是没有人能告诉我执行这种操作需要使用什么语法吗?
编辑:如评论中所述,pwd将最终给出绝对路径,因此我的播放列表最终将在某个目录d'oh中被命名为.txt!因此,我必须修剪路径。感谢我们发现我可能花了很长时间才想知道我的文件在哪里!
解决方案
回答
最好的方法是使用"" $(命令替换)"(感谢Landon):
ls > "$(pwd).txt"
有时我们还会看到人们使用较旧的反引号表示法,但这在嵌套和转义方面有一些缺点:
ls > "`pwd`.txt"
注意,pwd
的未经处理的替换是绝对路径,因此上述命令在与工作目录相同的目录中创建一个名称相同的文件,但扩展名为.txt
。 Thomas Kammeyer指出," basename"命令会删除前导目录,因此这将在当前目录中创建一个文本文件,并带有该目录的名称:
ls > "$(basename "$(pwd)").txt"
也感谢erichui提出了路径中的空间问题。
回答
语法为:
ls > `pwd`.txt
那是"〜"下方的"`"字符,而不是常规的单引号。
回答
要按照我们所说的去做,我们可以尝试:
ls > `pwd`.txt
它将使用完整的路径名,应该没问题。
请注意,如果我们在主目录中执行此操作,则可能
在/ home / hoboben中,我们将尝试创建/home/hoboben.txt,
上面目录中的文本文件。
这就是你想要的吗?
如果我们希望目录包含以它命名的文件,我们将得到
当前目录的基本名称,然后将.txt添加到pwd。
现在,而不是使用pwd命令...为什么不使用PWD环境变量?
例如:
ls > $PWD.txt
或者
ls > ${PWD}.txt
这可能是我们想在第二个示例中记住的内容。
如果我们在/ home / hoboben中,并且想要创建/home/hoboben/hoboben.txt,请尝试:
ls > ${PWD}/${PWD##*/}.txt
如果执行此操作,则文件将包含其自己的名称,因此通常,我们可以通过以下几种方式之一对此名称进行补救。只要不使用-a标志(然后可以选择重命名结果文件),就可以重定向到其他位置并以点开头移动该文件或者命名该文件,以使其对ls命令隐藏。
我编写了自己的脚本来管理音乐文件的目录层次结构,并且使用了名为" .info"的子目录来将曲目数据包含在一些备用文件中(基本上,我是通过这种方式"隐藏"元数据)。之所以可以,是因为我的需求很简单,而我的收藏却很少。
回答
使用以上方法将在当前目录上一级创建文件。如果我们希望所有播放列表都转到一个目录,则需要执行以下操作:
#!/bin/sh MYVAR=`pwd | sed "s|/|_|g"` ls > /playlistdir/$MYVAR-list.txt
回答
这等效于反引号解决方案:
ls > $(pwd).txt
回答
我怀疑问题可能是目录名称之一中存在空格。例如,如果工作目录是" / home / user / music / artist name"。 Bash会以为我们要重定向到/ home / user / music / artist和name.txt会感到困惑。我们可以使用双引号解决此问题
ls > "$(pwd).txt"
另外,我们可能不想重定向到$(pwd).txt。在上面的示例中,我们将把输出重定向到文件" / home / user / music / artist name.txt"