Команда оболочки Bash не работает без эха

Как установлено в комментариях, проблема связана с разрешениями для каталогов выше /absolute/path/to/test.sh, в которых не -пользователь root должен иметь права «выполнить» (x ), чтобы иметь возможность для доступа к скрипту.

Это можно диагностировать, посмотрев режим каждого из родительских каталогов, например, с помощью такой команды, как:

ls -ld / /absolute /absolute/path /absolute/path/to /absolute/path/to/test.sh

И проверка того, будет ли пользователь «test1» иметь разрешения на выполнение для всех каталогов, в дополнение к разрешениям на чтение самого скрипта test.sh.

1
02.04.2020, 22:04
3 ответа

Это не кавычки. У вас , а не":

$ uniprops “
U+201C ‹“› \N{LEFT DOUBLE QUOTATION MARK}
    \pP \p{Pi}
    All Any Assigned Punct Is_Punctuation Common Zyyy Pi P General_Punctuation
       InPunctuation Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase
       Initial_Punctuation Pat_Syn Pattern_Syntax PatSyn Print X_POSIX_Print
       Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct


$ uniprops '"'
U+0022 ‹"› \N{QUOTATION MARK}
    \pP \p{Po}
    All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
       Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
       Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
       X_POSIX_Print Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct

Поскольку кавычки в именах целей не являются надлежащими двойными кавычками, второй аргумент будет разделен на пробелы,и первая команда mvпопытается переместить два файла R 1 Pe.jpgи “R1в несуществующий -каталог Pe.jpg”. Это и является причиной ошибок.

Так что попробуй:

for f in *.jpg; do echo mv "$f" "${f/ /}"; done
4
28.04.2021, 23:19

Да, кавычки - это проблема. Эхо показывает команду как:
mv R 1 Pe.jpg “R1 Pe.jpg”
Если бы вы напечатали это в командной строке, это бы не удалось, потому что пробелы в исходном коде не заключены в кавычки и не экранированы. Правильная команда будет:
mv "R 1 Pe.jpg" "R1 Pe.jpg"
Чтобы поставить галочки вокруг переменной $f, я бы предложил что-то вроде этого:
mv "\""$f"\"" "${f/ /}"
где "\"" — escape-код для печати двойной кавычки.
То есть:echo " n "отображает n. echo " \n " экранирует n и показывает новую строку. Точно так же echo " \" "экранирует кавычки внутри кавычек.
Другим вариантом может быть:
mv '"'$f'"' "${f/ /}"

-1
28.04.2021, 23:19

Да, это проблема цитирования (см. другие ответы ).

Однако для этой конкретной проблемы лучше использовать команду rename. (Ларри Уолла)

напр.

rename -n -e "s/ //" *.jpg

После тестирования и проверки выходных данных. Снимите -n.

Установка

В Debian с apt install rename.

0
28.04.2021, 23:19

Теги

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