$ ls -l
bin/
$ ls bin/
startup.sh shutdown.sh
我写了一个名为的脚本,restart.sh
里面bin/
看起来像
#!/bin/sh
sh ./shutdown.sh
sh ./startup.sh
现在bin/
目录看起来像这样。
$ ls -l bin/
startup.sh shutdown.sh restart.sh
当我执行restart.sh
内部时bin/
它就起作用了。
当我执行restart.sh
外部时bin/
,它没有。
$ ls
bin/
$ ./bin/restart.sh
sh: ./shutdown.sh: No such file or directory
sh: ./startup.sh: No such file or directory
$ cd bin
$ ./restart.sh
I'm happy...
我怎样才能让它工作?
为什么要投反对票?这正常吗?
更新
我很感谢评论和回答。我已经知道.
系统中的意思了。我必须为让人们感到困惑而道歉。我接受了答案,因为这正是我的问题所要理解的上下文。我应该问一些像我怎样才能让 shell 脚本知道它的路径..?
我为别人回答了这个问题。有很多搜索结果可以检测 shell 脚本中的实际位置。我在BASH 脚本如何找到自己的位置。
#!/bin/sh
wd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo $wd
sh $wd/shutdown.sh
sh $wd/startup.sh
答案1
当您输入时,会./scriptname.sh
显示./
“仅在该文件夹中查找 scriptname.sh”。
并且您正在执行此操作,但是 scriptname.sh 不存在的文件夹中,因此 shell 返回“没有此文件或目录”。
事实上,您的 restart.sh 脚本代表您调用 ./shutdown.sh 并没有什么区别,您仍然位于一个不存在 shutdown.sh 的文件夹中,因此 shell 找不到它。
您要么需要将目录添加到$PATH
(一个包含 shell 始终搜索的文件夹列表的环境变量,例如export PATH=$PATH:/home/me/bin
(重新启动后将无法继续)),要么需要更改要调用的脚本/home/me/bin/shutdown.sh
,要么需要脚本cd /home/me/bin/
并调用./shutdown.sh
。