Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中将命令的结果用作参数?_Bash_Command Line - Fatal编程技术网

在bash中将命令的结果用作参数?

在bash中将命令的结果用作参数?,bash,command-line,Bash,Command Line,要为文件夹中的所有音乐创建播放列表,我在bash中使用以下命令: ls > list.txt 我想使用pwd命令的结果作为播放列表的名称 比如: ls > ${pwd}.txt #!/bin/sh MYVAR=`pwd | sed "s|/|_|g"` ls > /playlistdir/$MYVAR-list.txt 但这不起作用-有人能告诉我需要用什么语法来做这样的事情吗 编辑:如评论中所述,pwd最终将给出一个绝对路径,因此我的播放列表将在某个目录中命名为.txt

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

ls > list.txt
我想使用
pwd
命令的结果作为播放列表的名称

比如:

ls > ${pwd}.txt
#!/bin/sh

MYVAR=`pwd | sed "s|/|_|g"`
ls > /playlistdir/$MYVAR-list.txt
但这不起作用-有人能告诉我需要用什么语法来做这样的事情吗


编辑:如评论中所述,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

这可能是你在第二个例子中想要记住的

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

ls > ${PWD}/${PWD##*/}.txt
如果您这样做,文件将包含它自己的名称,因此通常,您可以通过以下几种方法之一来解决此问题。只要不使用-a标志(然后可选地重命名生成的文件),就可以重定向到其他位置并移动该文件或将该文件命名为以点开头的文件,从而对ls命令隐藏该文件


我编写自己的脚本来管理音乐文件的目录层次结构,例如,我使用名为“.info”的子目录来在一些备用文件中包含曲目数据(基本上,我用这种方式“隐藏”元数据)。因为我的需求很简单,而且我的收藏也很小,所以它可以正常工作。

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

ls > ${pwd}.txt
#!/bin/sh

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

这相当于backtick解决方案:

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”

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

ls >/playlistdir/${PWD##/*}.txt
这可能不是您想要的,因为您不知道文件在哪里(除非更改ls命令)

将“/”替换为“”

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

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

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

但请注意,使用backticks或$()仍将派生另一个shell。。。使用环境变量是成本最低的方法。没错,但是问题的标题和标签是广义的,所以答案也可能是广义的。在这种情况下,环境变量是“更好”的选项,但它不是问题的一般答案?这不取决于一个人使用的键盘布局吗?
ext=.mp3 #leave blank for all files
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt