【问题标题】:Shell script with whitespace in path executes differently depending on directory路径中带有空格的 Shell 脚本的执行方式因目录而异
【发布时间】:2010-09-19 16:18:21
【问题描述】:

我已经编写了一个脚本来用 wine 打开 Spotify:

#!/bin/bash
DIR="/home/jorgsk/.wine/drive_c/Program Files/Spotify/"
cd "$DIR"
wine spotify.exe 2>/dev/null

由于“程序文件”中的空格,我将“$DIR”传递给带有引号的 cd;如果我没有引号 "/home/jorgsk/.wine/drive_c/Programs" 将被视为 cd 的参数,这显然会导致错误消息。

如果我使用 ./spotify 从其本地目录 (/home/jorgsk/bin) 启动上述脚本,Spotify 会正常启动。但是,由于我希望从任何地方启动它,我将 /home/jorgsk/bin 添加到 .bashrc 中的 $PATH 变量中。例如,当我从我的主目录写入“spotify”时,我收到错误消息

bash: /home/jorgsk/.wine/drive_c/Program: No such file or directory

如果在脚本目录中使用 ./spotify 启动 tje 脚本时,如果我在引号中不包含 $DIR,则会收到相同的错误消息。

这里发生了什么?

【问题讨论】:

  • 当您输入which spotify 时,您会返回什么?

标签: bash shell path whitespace


【解决方案1】:

我不知道答案,但我想我可以给你一个确定问题的程序。

添加set -x 让脚本回显它正在运行的行。

 #!/bin/bash
 set -x
 DIR="/home/jorgsk/.wine/drive_c/Program Files/Spotify/"
 cd "$DIR"
 wine spotify.exe 2>/dev/null

另外,将脚本命名为 spotify 以外的名称。虽然看起来并不重要,但谁知道一旦葡萄酒得到控制会发生什么复杂的行为?

【讨论】:

  • 添加 set -x 什么也没做,它只是给出了和以前一样的错误。当我将文件重命名为“testme”时,Spotify 启动并且我按预期从脚本中获得了输出。
  • 换句话说,它现在可以工作了!似乎 Wine 必须有某种捷径来发现我找不到的地方。然而神秘的是,“which spotify”给出了“/home/jorgsk/bin/spotify”!
  • @Viktiglemma:使用type -a spotify 而不是which spotify。它可能会告诉您是否有别名或函数优先于您的 PATH 中的可执行文件。
  • 确实,spotify 有一个别名设置...我不得不承认是我自己设置的,后来忘记了。无论如何,我学到了很多,谢谢你的回答。
  • 啊哈,这就是“-x”应该找到的。 (它不应该修复任何东西,它只是应该调试脚本......)
【解决方案2】:

我不确定为什么会发生这种情况 - 看起来它应该对我有用。

你说这是在你的路径中,但实际上是被调用的版本吗?

尝试从您的主目录运行:which spotify。 which 命令告诉您运行的脚本的路径。

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2019-06-30
    • 2011-08-16
    • 2021-05-09
    相关资源
    最近更新 更多