在 shell 脚本中更改目录工作目录

在 shell 脚本中更改目录工作目录

我正在尝试编写一个简单的 shell 脚本,它将目录更改为 shell 脚本目录并回显它。

这是脚本:

#!/bin/bash
# cd '/explicit/path/to/script'
cd $(dirname $0)
echo $(dirname $0)

即使我使用明确的 cd 到脚本目录,输出确实总是如此。

/bin

我缺少什么?

答案1

您需要运行脚本而不是获取它:

/path/to/script.sh

(没有.)。

当你跑步时

. /path/to/script.sh

$0是您当前的外壳,大概位于/bin(因此您看到的行为)。请注意,不一定如此/bin/bash,当获取脚本时,shebang 没有任何效果。

卢卡斯' 其他点都是有效的,您应该使用引号并dirname直接运行,而不需要echo.

答案2

该变量$0指向您自行执行的 shell 脚本。所以如果你有一个文件包含这个

#!/bin/sh
echo "$0"

并将其复制到/bin/my-script~/somewhere/my-script-2,使两个副本都可执行,您可以观察到此行为(我假设/bin是在您的 中$PATH):

$ my-script
/bin/my-script
$ ~/somewhere/my-script-2
/home/luc/somewhere/my-script-2
$ cd
$ somewhere/my-script-2
somewhere/my-script-2
$ ../../bin/my-script
../../bin/my-script
$ cd /bin
$ ./my-script
./my-script

等等。

在交互式 shell 中,$0指向您执行的 shell,并且很可能位于/bin.因此,如果您获取上述 shell 脚本,您将始终看到 shell 解释器的路径:/bin/bash。为此,这两个脚本不必可执行:

$ . my-script
/bin/bash
$ . ~/somewhere/my-script-2
/bin/bash
$ cd
$ . somewhere/my-script-2
/bin/bash
$ . ../../bin/my-script
/bin/bash
$ cd /bin
$ . ./my-script
/bin/bash

原因是源脚本在源脚本所在的同一进程中执行,并且$0没有更改($@尽管已更新)。

如果为您dirname "$0"打印/bin,则仅意味着您执行的文件位于/bin或您正在dirname从交互式会话或源脚本运行,并且您使用的解释器位于/bin.

其他一些要点:

  • 你不需要做echo "$(dirname "$0")"dirname "$0"也会做同样的事情。
  • 使用pwd获取当前的工作目录。
  • 加上引号$0和命令替换,否则可能会遇到问题。尝试类似的方法cd $(echo a b c)来查看问题。

相关内容