На этот вопрос уже есть ответ здесь:
Я хотел бы запустить команду с аргументом, помещенным в тот же каталог, что и сценарий оболочки, из сценария оболочки.
пример:
my_installer.sh:
#!/bin/sh
sudo dpkg -i --someflags=abcd blah.deb
Как узнать my_installer.sh
, где находится blah.deb
?
Я пробовал ./ blah.deb
и посмотрел на некоторые env vars ... Я получаю сообщение об ошибке, что файл не найден.
Я предполагаю, что пользователь дважды щелкнет сценарий или запустит его из дома, а не cd к месту расположения сценария.
Согласно вопросу: (a) сценарий находится в том же каталоге как blah.deb
, и (2), пользователь выполнит сценарий от некоторых неизвестный другой каталог. В этом случае:
#!/bin/bash
sudo dpkg -i --someflags=abcd "${BASH_SOURCE[0]%/*}/blah.deb"
строка хижины обновлена до bash
так, чтобы мы могли использовать эти BASH_SOURCE
массив, который говорит нам местоположение выполняемого сценария.
, поскольку это избегает замены команды, она должна работать даже в патологическом случае, в котором имя каталога заканчивается символами новой строки.
Вы можете первый CD в сценарии к местоположению сценария с
cd "$(dirname $0)"
или используйте
sudo dpkg -i --someflags=abcd "$(dirname $0)"/blah.deb
Это работает также с/bin/sh, являющимся тире вместо удара.