Расширение пути внутри фигурной скобки

Причиной моей проблемы оказалась -несуществующая цель. Вместо default.target(, который является символической ссылкой, по крайней мере, в CentOS, но не соответствует уровню запуска ), я должен был использовать multi-user.target, который соответствует уровню запуска 3. Тогда правильная конфигурация становится:

[Install]
WantedBy=multi-user.target

Спасибо всем за уделенное время и отзывы!

0
31.10.2020, 13:59
2 ответа

Руководство Баша:

Patterns to be brace expanded take the form of an optional preamble, followed by either a series of comma-separated strings or a sequence expression between a pair of braces

Ваша попытка

  1. mkdir /home/karan/{P*}/123
    

не является допустимой формой раскрытия фигурных скобок, так как внутри фигурных скобок нет ни запятых, ни последовательности. Таким образом, вы получаете именно то, что отдали, /home/karan/{P*}/123.

  1. mkdir /home/karan/{P*,}/123
    

— это расширение скобок (обратите внимание на запятую ), которая пытается создать каталоги /home/karan/P*/123и /home/karan//123. Обратите внимание, что P*по-прежнему не расширяется расширением имени файла, потому что еще нет каталогов .../Pictures/123и .../Public/123. Другими словами, если совпадений нет, расширения имени файла не происходит.

В любом случае, как показывает (1 ), нет смысла использовать раскрытие фигурной скобки с одним элементом, это как качели с одним человеком. Прямой

  1. mkdir /home/karan/P*/123
    

потерпит неудачу по той же причине, нет соответствия.

Я не вижу хорошего способа избежать написания путей в вашем конкретном случае, но если есть много совпадающих каталогов или путей, цикл for сэкономит вам нажатия клавиш.

for d in /home/karan/P*/; do mkdir "$d"yo; done
1
18.03.2021, 22:53

С помощью zshвы можете сделать:

(){ mkdir $^@/yo; } /home/karan/P*(/)

(где $^arrayвключаетrcexpandparam(для расширения массива стилейrc-)только для расширения $array, а расширение этого глобуса (здесь с квалификатором глобуса /для ограничения для файлов типа каталог)превращается в массив $@с помощью анонимной функции ).

Или вы могли бы сделать:

mkdir /home/karan/P*(/e:REPLY+=/yo:)

(использование квалификатора evalue glob для добавления /yoк соответствующим файлам ).

Или:

set -o histsubstpattern
mkdir /home/karan/P*(/:s:%:/yo)

(с помощью модификатора стиля :s/string/replacement/csh -, чтобы добавить /yoв этом случае. В histsubstpatternstringинтерпретируется как шаблон, и, как и в ${var/pattern/replacement}ksh, ведущий %означает, что шаблон закреплен в конце подлежащего )

.

С rcили производными:

dirs = ( /home/karan/P*/ )
mkdir $dirs^yo

es, одна из этих rcпроизводных также имеет анонимные функции, подобные zshвыше, хотя и с другим синтаксисом:

@ {mkdir $*^yo} /home/karan/P*/

Сfish:

set dirs /home/karan/P*/
mkdir ${dirs}yo

С ksh93 или bash (или zsh )вы всегда можете сделать:

dirs=(/home/karan/P*/)
mkdir "${dirs[@]/%/yo}"

Или с любой оболочкой и GNUxargs:

printf '%syo\0' /home/karan/P*/ | xargs -r0 mkdir

(имейте в виду, что расширениеP*/(в отличие от zshP*(/))также будет включать символические ссылки на каталоги. В zshзамените квалификатор /glob на -/, если это действительно то, что вам нужно ).

3
18.03.2021, 22:53

Теги

Похожие вопросы