【问题标题】:Bash script to cd to directory with spaces in pathnameBash 脚本 cd 到路径名中带有空格的目录
【发布时间】:2010-10-10 00:04:28
【问题描述】:

我在 macOS X 上使用 Bash,我想创建一个简单的可执行脚本文件,该文件在运行时会更改为另一个目录。但是,该目录的路径中有空格。你到底是怎么做到的?这就是我所拥有的......

文件名:cdcode

文件内容:

cd ~/My Code

现在承认,这不是一个长路径名,但我的实际路径名是五个目录深,其中四个目录在路径中有空格。

顺便说一句,我已经尝试过 cd "~/My Code" 和 cd "~/My\ Code",但这些都不起作用。

【问题讨论】:

  • 我遇到了与描述的问题类似的问题。 IE。没有一种可能的方法可以更改为其中有空格的目录。没有什么像: cd "My Passport" cd My\ Passport cd My" Passport" 没有任何工作。编译工作正常。我可以列出: ls -l My\ Passport/ 工作正常。 \>uname -a Linux 主机 2.6.18-8.1.8.el5.centos.plus #1 SMP Mon Jul 16 08:49:50 EDT 2007 i686 i686 i386 GNU/Linux \>bash --help GNU bash,版本 3.1 .17(1)-release-(i686-redhat-linux-gnu) 有什么想法吗?

标签: bash escaping


【解决方案1】:
cd ~/My\ Code

似乎对我有用...如果删除引号但保留斜线不起作用,您可以发布一些示例代码吗?

【讨论】:

    【解决方案2】:

    一个反斜杠对我有用:

    ry4an@ry4an-mini:~$ mkdir "My Code"
    
    ry4an@ry4an-mini:~$ vi todir.sh
    
    ry4an@ry4an-mini:~$ . todir.sh 
    
    ry4an@ry4an-mini:My Code$ cat ../todir.sh 
    #!/bin/sh
    cd ~/My\ Code
    

    您确定问题不在于您的 shell 脚本正在更改其子 shell 中的目录,但完成后您又回到了主 shell(和原始目录)?我通过使用避免了这种情况。在当前 shell 中运行脚本,尽管大多数人会为此使用别名。空格可能是红鲱鱼。

    【讨论】:

    • 谢谢,Ry4an(和其他受访者)。看来我执行脚本不正确。我只是想像这样运行它:% ./cdsomedir 我没有意识到我需要使用“。”像你一样运行脚本: % 。 cdsomedir.sh 一旦我这样做了,它就起作用了。新手误区。谢谢!
    【解决方案3】:

    在 Linux 下工作时,下面的语法是正确的:

    cd ~/My\ Code

    但是,当您执行文件时,请使用以下语法:

    $ . cdcode

    (只是 '.' 而不是 './')

    【讨论】:

    • 出于好奇,这有什么关系?我只见过'./'被使用过。
    • ./ 将生成一个新的 shell,然后更改目录。因此,当脚本退出时,它会返回到生成新 shell 的 shell……您将位于执行脚本的目录中,而不是 ~/My Code。 '。另一方面,会导致脚本在 shell 的当前实例中执行。
    • 点“。”是一个unix命令,是“source”命令的别名。它应该跟一个文件名。因此,“source myfile”将在您当前的 shell 中运行该文件。而“.myfile”也会这样做。 “./”变量表示“当前目录”,不是命令。
    【解决方案4】:

    您可以使用以下任何一种:

    cd ~/"My Code"
    cd ~/M"y Code"
    cd ~/My" Code"
    

    你不能使用:

    cd ~"/My Code"
    

    第一个工作是因为 shell 将 ~/ 扩展为 $HOME/,然后在没有双引号的情况下添加 My Code。第二个失败,因为没有一个名为“"”(双引号)的用户供~" 映射到。

    【讨论】:

      【解决方案5】:

      当您双引号路径时,您将停止波浪号扩展。所以有几种方法可以做到这一点:

      cd ~/"My Code"
      cd ~/'My Code'
      

      这里没有引用波浪号,所以波浪号扩展仍然会运行。

      cd "$HOME/My Code"
      

      您可以在双引号字符串中展开环境变量;这基本上就是波浪号扩展正在做的事情

      cd ~/My\ Code
      

      您还可以使用反斜杠转义特殊字符(如空格)。

      【讨论】:

      • 你甚至可以 cd ~/My' 'Code,但如果你可以用反斜杠转义它,那就太傻了
      【解决方案6】:

      我现在遇到了类似的问题,我正在使用 bash 脚本转储一些数据。我最终在脚本文件夹中创建了一个符号链接,其中没有任何空格。然后我将我的脚本指向符号链接,它工作正常。

      创建您的链接。 ln -s [目标目录或文件] ./[快捷方式]

      Mau 或可能没用。

      【讨论】:

        【解决方案7】:

        我在this page找到了下面的解决方案:

        x="test\ me"  
        eval cd $x
        

        双引号文本常量中的\ 和cd 之前的eval 的组合使它像魅力一样工作!

        【讨论】:

        • 更清晰:对于 cd'ing 到脚本文件的目录: DIR = $(dirname "$0");评估 cd $DIR
        • 这对我在 OS X 机器上运行 bash 脚本很有帮助。 ?
        • 这里真的不需要eval。
        • 在 OS X 上,如果没有 eval,我无法获得其他/先前的答案。
        【解决方案8】:

        使用双引号

        go () 
        { 
            cd "$*"
        }
        

        【讨论】:

        • 谢谢。 .bashrc 文件中功能的一个有用补充,用于在将包含空格的目录名称粘贴到命令行时更改目录,而无需转义空格或引用整个内容。 cds 是一个更好的名字。
        • 有什么方法可以扩展它(没有 if),使得 go 等同于 cd,即 cd 到主目录?
        【解决方案9】:

        在脚本中避免使用 ~;改用 $HOME。

        【讨论】:

          【解决方案10】:

          最简单的方法是——

           $ cd My\ Folder
          

          在 bash 中,运行 DIR 命令,在结果中您会看到在它们之间有空格的文件夹或路径名已写入结果中,如下所示 -

          $dir
          My\ Folder
          New\ Folder
          

          【讨论】:

            【解决方案11】:

            在遇到同样的问题后,我尝试了两种不同的解决方案:

            1。在变量中使用双引号 ("")。

            最简单的方法只是将您的变量双引号,如上一个答案中所指出的:

            cd "$yourPathWithBlankSpace"
            

            2。使用eval。

            根据这个答案Unix command to escape spaces 你可以去掉空格然后使用eval,像这样:

            yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
            eval cd $yourPathEscaped
            

            【讨论】:

              【解决方案12】:

              使用单引号,例如:

              myPath=~/'my dir'
              
              cd $myPath
              

              【讨论】:

                【解决方案13】:

                这样就可以了:

                cd ~/My\ Code
                

                我不得不使用它来处理存储在 iCloud Drive 中的文件。您不想使用双引号 ("),因为它必须是绝对路径。换句话说,您不能将双引号与波浪号 (~) 结合使用。

                例如,我不得不在最近的一个项目中使用它:

                cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project
                

                希望对你有帮助。

                【讨论】:

                  【解决方案14】:

                  我阅读了所有这些内容,但它们似乎不适用于 macOS Monterey。然后我将标题从#!/bin/sh 更改为#!/bin/zsh,这似乎可以解决问题。

                  【讨论】:

                    猜你喜欢
                    • 2016-07-22
                    • 1970-01-01
                    • 2021-05-09
                    • 2010-12-30
                    • 2021-12-19
                    • 2019-06-30
                    • 2013-08-21
                    • 2011-10-17
                    • 1970-01-01
                    相关资源
                    最近更新 更多