Переменная $ 0
содержит путь к сценарию:
$ cat ~/bin/foo.sh
#!/bin/sh
echo $0
$ ./bin/foo.sh
./bin/foo.sh
$ foo.sh
/home/terdon/bin/foo.sh
$ cd ~/bin
$ foo.sh
./foo.sh
Как видите, результат зависит от способа, которым он был вызван, но всегда возвращает путь к сценарию относительно способа сценария был казнен. Поэтому вы можете сделать:
## Set mydir to the directory containing the script
## The ${var%pattern} format will remove the shortest match of
## pattern from the end of the string. Here, it will remove the
## script's name,. leaving only the directory.
mydir="${0%/*}"
# config load
source "$mydir"/config.sh
Если каталог находится в вашем $ PATH
, все еще проще. Вы можете просто запустить исходный config.sh
. По умолчанию источник
будет искать файлы в каталогах в $ PATH
и будет использовать первый найденный файл:
$ help source
source: source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Если вы уверены, что ваш config.sh
] уникален или, по крайней мере, что он первый найденный в $ PATH
, вы можете напрямую получить его. Однако я предлагаю вам не делать этого и вместо этого придерживаться первого метода. Вы никогда не знаете, когда другой config.sh
может быть в вашем $ PATH
.
После поиска выяснилось, что это аппаратная проблема. Нажатие Tab
фактически отправило код для Volume up
, поэтому это нельзя решить программно.