Я видел функцию оболочки для изменения dir до $ upto.

upto() {
    cd "${PWD/\/$upto\/*//$upto}"
}

Но я не понимаю "${PWD/\/$upto\/*//$upto}" . Может ли кто-нибудь любезно объяснить?

Эта функция была найдена в ответе на вопрос о Unix & Linux Stack Exchange.

1 ответ1

3

Короткий ответ? Оказывается, вы можете делать множество манипуляций с переменными, просто вставляя их, как если бы вы использовали $PWD . Цитирование из справочника bash:

${parameter/pattern/string}

Шаблон расширяется, чтобы создать шаблон так же, как в расширении имени файла. Параметр раскрывается, и самое длинное совпадение шаблона с его значением заменяется на строку. Если шаблон начинается с ' / ', все совпадения шаблона заменяются строкой. Обычно заменяется только первый матч. Если шаблон начинается с « # », он должен совпадать в начале расширенного значения параметра. Если шаблон начинается с « % », он должен совпадать в конце расширенного значения параметра. Если строка пуста, совпадения с шаблоном удаляются, и / следующий шаблон может быть опущен. Если параметр равен « @ » или « * », операция замещения применяется к каждому позиционному параметру по очереди, и расширение является результирующим списком. Если параметр представляет собой переменную массива, подписанную с помощью « @ » или « * », операция замещения применяется к каждому члену массива по очереди, и расширение является результирующим списком.

Итак, в этом примере: ${PWD/\/$upto\/*//$upto}

  • параметр PWD .
  • pattern это /$upto/* (это то, для чего нужны обратные слэши, чтобы избежать преждевременного завершения паттерна косыми чертами в паттерне и избежать включения поведения "заменить все совпадения", которое вы обычно получаете из паттерна , начинающегося с косая черта)
  • Строка is /$upto

Таким образом, он просматривает переменную $PWD (которую оболочка поддерживает как текущий каталог), находит первую точку там, где есть имя каталога в $upto окруженное косой чертой (так что установка $upto в " dog " не будет найдите каталог с именем " dogfood ") и замените это место и весь остальной текущий каталог просто на " /$upto ".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .