Что означает "cd ${0%/*}" в bash?

Я столкнулся с git commit, который очищает некоторые команды readlink и dirname с помощью этой замены магической переменной cd ${0%/*}.

Как bash интерпретировать его?

Ответ 1

% здесь называется оператором сопоставления с образцом.

Цитата из книги "Изучаем 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.

Ответ 2

Команда cd ${0%/*} изменяет каталог в каталог, содержащий script, предполагая, что $0 установлен на полностью определенный путь script.