Я столкнулся с 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.