Я столкнулся с git commit, который очищает некоторые команды readlink и dirname с помощью этой замены магической переменной cd ${0%/*}.
Как bash интерпретировать его?
Я столкнулся с git commit, который очищает некоторые команды readlink и dirname с помощью этой замены магической переменной cd ${0%/*}.
Как bash интерпретировать его?
% здесь называется оператором сопоставления с образцом.
Цитата из книги "Изучаем Bash Shell":
Классическое использование операторов сопоставления с образцом заключается в удалении компонентов имен путей, таких как префиксы каталогов и суффиксы имен файлов. Имея это в виду, вот пример, который показывает, как работают все операторы. Предположим, что переменная path имеет значение /home/cam/book/long.file.name; затем:
Expression Result Comments
${path##/*/} long.file.name ## takes out longest matched substring from the front
${path#/*/} cam/book/long.file.name # takes out shortest matched substring from the front
$path /home/cam/book/long.file.name
${path%.*} /home/cam/book/long.file % takes out shortest matched substring from the rear
${path%%.*} /home/cam/book/long %% takes out longest matched substring from the rear
Их может быть трудно запомнить, поэтому вот удобное мнемоническое устройство:
# соответствует фронту, потому что числовые знаки предшествуют числам;% соответствует тылу, потому что знаки процента следуют за числами.В вашем конкретном случае 0 является аналогом path в моем примере, поэтому вы должны это знать.
Если $0 равен /home/chj/myfile.txt, то cd ${0%/*} расширится до cd /home/chj, то есть будет удалена часть "файл".
Я понимаю ваше стремление задать этот вопрос, потому что слишком сложно найти ответ, не потратив несколько часов на изучение книги Bash.
Команда cd ${0%/*} изменяет каталог в каталог, содержащий script, предполагая, что $0 установлен на полностью определенный путь script.