$ 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...
Как я могу заставить это работать?
Почему голоса против? Это нормально?
ОБНОВЛЕНИЕ
Я ценю и комментарии, и ответы. Я уже знаю, что .
означает в системе. Приношу свои извинения за то, что сбил людей с толку. Я принял ответ, потому что именно в этом контексте следует понимать мой вопрос. Я должен был спросить у некоторых вроде Как я могу сделать сценарий оболочки известным по его пути? ..
Я даю свой ответ для кого-то другого. Существует множество результатов поиска для определения фактического положения в сценариях оболочки. Я нашел его в Как сценарий BASH может найти свое собственное местоположение .
#!/bin/sh
wd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo $wd
sh $wd/shutdown.sh
sh $wd/startup.sh
Kiedy wpiszesz ./ nazwa_skryptu.sh
./
mówi „szukaj tylko w tym folderze nazwy_skryptu.sh”.
I robisz to w folderze, w którym nazwa_skryptu.sh nie istnieje, więc powłoka zwraca „Nie ma takiego pliku lub katalogu”.
Fakt, że skrypt restart.sh wywołuje w Twoim imieniu plik ./shutdown.sh nie ma znaczenia, nadal jesteś w folderze, w którym nie istnieje plik shutdown.sh , więc powłoka tak es go nie znajduje.
Albo musisz dodać swój katalog do $ PATH
(zmienna środowiskowa zawierająca listę folderów, które powłoka zawsze przeszukuje, np. export PATH = $ PATH: / home / me / bin
(nie przetrwa ponownego uruchomienia))lub musisz zmienić skrypt, aby wywołać /home/me/bin/shutdown.sh
lub potrzebujesz skryptu na cd / home / me / bin /
i zadzwonić pod numer ./shutdown.sh
.