我正在尝试编写一个简单的 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)
来查看问题。