Поскольку ОП не предоставил образец сценария, я собираюсь его сделать. Это сделает одну вещь. Бег лс
в каталоге скрипта.
Да, я знаю, что ты можешь просто сделать лс
без ./
. Но для этого примера я делаю вид, что это необходимо, чтобы продемонстрировать сценарий, который использует текущий каталог сценария.
#!/usr/bin/env bash
лс ./
Сохраните этот скрипт где-нибудь. сохраню как /home/ubuntu/тест/myscript
. Сделайте его исполняемым с помощью chmod +x /home/ubuntu/test/myscript
. В настоящее время CD
в каталог, где находится скрипт (например, компакт-диск /дом/убунту/тест
) и запустите скрипт с помощью ./скрипт
:
ubuntu@computer:~/test$ ./myscript
myscript какой-то RandomFile
Все идет нормально. Но теперь давайте запустим его из другого каталога. В этом примере я собираюсь запустить его из корневого каталога (/
).
ubuntu@computer:~/test$cd/
ubuntu@computer:/$ /home/ubuntu/test/myscript
bin dev home lib lib64 потерянный + найденный mnt proc run snap sys usr
загрузка и т. д. init lib32 libx32 media opt root sbin srv tmp var
Упс. Мы хотели, чтобы он печатал файлы в местоположении скрипта, а не в местоположении пользователя. Прежде чем мы найдем решение, подумайте о Почему это делается на мгновение. Ответ прост. ./
относительно пользователя текущий каталог, а не один из скрипта.
Чтобы получить каталог скрипта изнутри скрипта, мы посмотрим на этот вопрос о переполнении стека.
Суть его проста: script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
получит текущий каталог скрипта и сохранит его в переменной script_dir
.
Давайте соответствующим образом обновим скрипт. Наш скрипт теперь такой:
#!/usr/bin/env bash
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
лс "$script_dir"
Давайте запустим его и посмотрим, работает ли он:
ubuntu@computer:/$ /home/ubuntu/test/myscript
myscript какой-то RandomFile
Оно работает! Он печатает файлы в каталоге скрипта, даже если вы не находитесь в том же каталоге, что и скрипт. Готово. Общая идея проста. В сценарии ./
относится к каталогу пользователя. "$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
относится к каталогу, в котором находится скрипт. Обновите свой скрипт соответствующим образом, и он должен работать.