【问题标题】:Shell Scripts in Mac OS X run from home directory?Mac OS X 中的 Shell 脚本从主目录运行?
【发布时间】:2011-06-03 18:26:00
【问题描述】:

我是 Windows 和 Linux 的长期用户,在 Mac OS X 上编写 shell 脚本时有过一些奇怪的经历。特别是,我可以很好地编写脚本并从终端运行它们,但每次我尝试运行一个从 Finder 窗口,它总是从用户的主目录而不是脚本所在的目录执行。也就是说,如果脚本位于

~/path/to/the/script.sh

它总是用完~。在过去,我不得不问我更多精通 Mac 的朋友如何解决这个问题,他们经常使用一些非常糟糕的技术来解决这个问题,但我不明白为什么会出现这种情况。

我的问题是 - 有没有一种简单的方法可以在 Mac OS X 中编写一个 shell 脚本,当在 Finder 中双击时,它会超出它所在的目录?

【问题讨论】:

  • 你为什么期望它不这样做?这只是定义的行为。
  • "根目录" != "用户的主目录"
  • 至少在 Windows 中,当您从资源管理器窗口运行程序时,您得到的默认行为是该程序在其所在目录之外运行。也许这是例外而不是规则,但这是我最习惯的。
  • @David Gelhar- 哎呀!感谢您指出这一点。
  • @OP 这不是很直观的默认行为 imo。这主要是为了解决 win32 处理共享库的方式中固有的一些问题,afaik。

标签: macos shell


【解决方案1】:

这种行为对我来说似乎是一致的。它继承了您的 finder 实例环境,该环境将植根于您的主目录。

不过,修复起来并不难。

cd "$(dirname "$0")"

应该做的伎俩阿拉:

richh-desktop % fullname.sh 
/home/richh/bin
richh-desktop % cd .. 
richh-desktop % fullname.sh 
/home/richh/bin
richh-desktop %        

【讨论】:

  • 如果任何文件名中有空格,请用双引号括起来(这是 OS X -- 文件名中有空格):cd "$(dirname "$0")"
【解决方案2】:

如果您希望脚本在其所在目录之外运行,则脚本必须更改其工作目录。鉴于您的示例是用 bash 编写的,我将用一个 bash 示例来回应。 $_ 值设置为当前脚本的绝对路径。您可以通过运行 man bash 找到更多信息

#!/bin/bash

PROGPATH=$(dirname $_)
cd $PROGPATH

# Do your stuff here

【讨论】:

    【解决方案3】:

    将由脚本为您更改目录。签出 this page

    【讨论】:

      【解决方案4】:

      $0的目的就是解决这个问题。

      【讨论】: