Оператор glob ~ filter
(and-not) применяет фильтр в качестве отрицательного сопоставления с шаблоном к результату всего glob.
Это позволяет, например:
grep foo ./**/*~*/.svn/*(.mh-1)
.
Здесь вам потребуется:
echo tdir/*~tdir/xx
Или:
echo tdir/*~*/xx
Или:
echo tdir/(*~xx)
Или используйте вместо него оператор отрицания ^
:
echo tdir/^xx
Код useradd вызывает библиотечную функцию mkdir для (попытки) создания указанного каталога. useradd проверяет код возврата, но только на то, что он не равен нулю; в этом случае я подозреваю, что mkdir возвращает ENOENT -- компонент каталога в имени пути не существует или является оборванной символической ссылкой
, поскольку родительский каталог (/opt/atlassian) не существовал или имел был удален во время ваших попыток добавить пользователя.
Как отмечают Kusalananda/roaima, самое простое решение здесь — создать структуру родительского каталога перед вызовом useradd:
sudo mkdir -p /opt/atlassian
sudo /usr/sbin/useradd --create- home --home-dir /opt/atlassian/bitbucket --shell /bin/bash atlbitbucket
Команды, которые вы используете для создания пользователя и его домашнего каталога, смогут создать домашний каталог только в том случае, если непосредственный родительский домашний каталог уже существует. Это не удастся, если он не сможет найти родительскую папку, в которой должен находиться домашний каталог, или если домашний каталог уже существует.
Это означает, что
$ mkdir -p /some/dir/myhome
$ useradd --home-dir /some/dir/myhome ...
не будет работать, поскольку /some/dir/myhome
существует, тогда как
$ rm -rf /some/dir
$ useradd --home-dir /some/dir/myhome ...
не будет выполнено, поскольку /some/dir
не существует.
Просто убедитесь, что каталог, в котором будет создан домашний каталог, существует, т.е. в вашей ситуации
mkdir -p /opt/atlassian