使用命令的结果作为bash中的参数?

使用命令的结果作为bash中的参数?

Using the result of a command as an argument in bash?

要为文件夹中的所有音乐创建播放列表,我在bash中使用以下命令:

1
ls > list.txt

我想将pwd(打印工作目录)命令的结果用作播放列表的名称。

就像是:

1
ls > ${pwd}.txt

但这行不通-有人可以告诉我执行此类操作需要使用什么语法吗?

编辑:如评论中所述,pwd将最终给出绝对路径,因此我的播放列表最终将在某个目录中被命名为.txt-d'哦! 因此,我必须修剪路径。 感谢您发现-我可能花了很长时间才想知道我的文件在哪里!


最好的方法是使用"$(command substitution)"(感谢Landon):

1
ls >"$(pwd).txt"

有时您还会看到人们使用较旧的反引号表示法,但这在嵌套和转义方面有一些缺点:

1
ls >"`pwd`.txt"

请注意,pwd的未处理替换是绝对路径,因此上述命令在与工作目录相同的目录中创建一个名称相同的文件,但扩展名为.txt。 Thomas Kammeyer指出,basename命令将剥离前导目录,因此这将在当前目录中创建一个文本文件,并带有该目录的名称:

1
ls >"$(basename"$(pwd)").txt"

也感谢erichui提出了路径中的空间问题。


这等效于反引号解决方案:

1
ls > $(pwd).txt


按照字面意思做,您可以尝试:

1
ls > `pwd`.txt

它将使用完整的路径名,应该没问题。
请注意,如果您在主目录中执行此操作,则可能
在/ home / hoboben中,您将尝试创建/home/hoboben.txt,
上面目录中的文本文件。

这就是你想要的吗?

如果您希望目录包含以它命名的文件,您将得到
当前目录的基本名称,然后将.txt附加到pwd。

现在,而不是使用pwd命令...为什么不使用PWD环境变量?

例如:

1
ls > $PWD.txt

要么

1
ls > ${PWD}.txt

您可能想在第二个示例中记住的内容。

如果您在/ home / hoboben中,并且想创建/home/hoboben/hoboben.txt,请尝试:

1
ls > ${PWD}/${PWD##*/}.txt

如果执行此操作,文件将包含其自己的名称,因此通常,您可以通过以下几种方法之一对此进行补救。只要不使用-a标志(然后可以选择重命名结果文件),就可以重定向到其他位置并以点开头移动该文件或命名该文件,以使其对ls命令隐藏。

我编写了自己的脚本来管理音乐文件的目录层次结构,并使用了名为" .info"的子目录来将曲目数据包含在一些备用文件中(基本上,我是通过这种方式"隐藏"元数据)。可以,因为我的需求很简单,而且我的收藏很小。


我怀疑问题可能是目录名称之一中存在空格。例如,如果您的工作目录是" / home / user / music / artist name"。 Bash会以为您尝试重定向到/ home / user / music / artist和name.txt会感到困惑。您可以使用双引号解决此问题

1
ls >"$(pwd).txt"

另外,您可能不想重定向到$(pwd).txt。在上面的示例中,您将把输出重定向到文件" / home / user / music / artist name.txt"


语法为:

1
ls > `pwd`.txt

那是"?"下方的"`"字符,而不是常规的单引号。


使用以上方法将在当前目录上一级创建文件。如果要将播放列表全部都转到一个目录,则需要执行以下操作:

1
2
3
4
#!/bin/sh

MYVAR=`pwd | sed"s|/|_|g"`
ls > /playlistdir/$MYVAR-list.txt


除去目录名称以外的所有内容

1
ls >/playlistdir/${PWD##/*}.txt

这可能不是您想要的,因为那样您就不知道文件在哪里(除非您更改ls命令)

用" _"替换" /"

1
ls >/playlistdir/${PWD//\//_}.txt

但是播放列表看起来很难看,甚至可能不适合选择窗口

因此,这将为您提供一个简短的可读名称和文件内的可用路径

1
2
ext=.mp3 #leave blank for all files
for FILE in"$PWD/*$ext"; do echo"$FILE";done >/playlistdir/${PWD##/*}.txt

推荐阅读