【问题标题】:Using the result of a command as an argument in bash?使用命令的结果作为 bash 中的参数?
【发布时间】:2010-09-08 15:54:24
【问题描述】:

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

ls > list.txt

我想使用pwd 命令的结果作为播放列表的名称。

类似:

ls > ${pwd}.txt

但这不起作用 - 谁能告诉我我需要使用什么语法来做这样的事情?

编辑: 正如 cmets pwd 中提到的,最终会给出一个绝对路径,所以我的播放列表最终会在某个目录中被命名为 .txt - 哦!所以我必须修剪路径。感谢您发现这一点 - 我可能会花很长时间想知道我的文件去了哪里!

【问题讨论】:

    标签: bash command-line


    【解决方案1】:

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

    ls > "$(pwd).txt"
    

    您有时还会看到人们使用较旧的反引号表示法,但这在嵌套和转义方面具有 several drawbacks

    ls > "`pwd`.txt"
    

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

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

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

    【讨论】:

    • 但请注意,使用反引号或 $( ) 仍然会派生另一个 shell...使用环境变量是成本最低的方法。
    • 是的,但是问题的标题和标签是通用的,所以答案也可以通用。在这种情况下,环境变量是“更好”的选项,但它不是问题的一般答案。
    【解决方案2】:

    语法是:

    ls > `pwd`.txt
    

    那是 '~' 下面的 '`' 字符,而不是常规的单引号。

    【讨论】:

    • 在“~”下面?这不取决于使用的键盘布局类型吗?
    【解决方案3】:

    按你说的做,你可以试试:

    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”的子目录,例如,在一些备用文件中包含曲目数据(基本上,我以这种方式“隐藏”元数据)。效果很好,因为我的需求很简单,我的收藏也很少。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        这相当于反引号解决方案:

        ls > $(pwd).txt
        

        【讨论】:

          【解决方案6】:

          我怀疑问题可能是其中一个目录名称中有空格。例如,如果您的工作目录是“/home/user/music/artist name”。 Bash 会感到困惑,认为您正在尝试重定向到 /home/user/music/artist 和 name.txt。你可以用双引号解决这个问题

          ls > "$(pwd).txt"
          

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

          【讨论】:

            【解决方案7】:

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

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

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

            用“_”替换“/”

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-09-21
              • 2020-02-02
              • 2019-06-29
              • 1970-01-01
              • 1970-01-01
              • 2012-06-07
              • 2020-11-04
              • 2012-03-27
              相关资源
              最近更新 更多