cp запускается из командной строки, но файл не найден в сценарии

realpathразрешает заданный путь. Помимо прочего, он также удаляет завершающие косые черты. Используйте -sдля предотвращения следующих симлинков

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
1
14.05.2019, 20:52
1 ответ

Ваш скрипт работает не так, как вы ожидаете, из-за порядка раскрытия.

Из руководства по bash:

The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and pathname expansion.

Как видите, раскрытие фигурных скобок идет первым, раскрытие переменных — позже. В присваивании раскрытие скобок не выполняется. В противном случае выражение x={1,2}было бы расширено до x=1 x=2, что также не имело бы смысла.

Одним из решений для этого, как вы узнали, является eval, потому что все расширение выполняется дважды, поэтому первое раскрытие переменной выполняется перед раскрытием второй скобки.

Убедитесь, что вы понимаете риски eval, в частности, никогда не используйте его для ненадежного ввода.

Поскольку вы используете bash, вы можете использовать массив.

files=(./*"$pattern"I{"$ifirst".."$ilast"}.ext )
cp "${files[@]}"../"$pattern"/"$i"/
2
27.01.2020, 23:30

Теги

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