лай не работает с файлами, имена которых содержит пробелы или скобки

Я записал сценарий удара и вставил его ~/.local/share/nautilus/scripts/.

В наутилусе, если я щелкаю правой кнопкой по файлу и выбираю меню сценария, он запустит http сервер, чтобы совместно использовать текущий файл, и QR-код отобразится, настолько мобильный может просканировать URL для загрузки файла. Сервер остановится, когда Вы закроете окно рис. QR.

Все это работает, но когда имена файлов содержат пространство или скобки, я не могу загрузить файл.

▶ cat ~/.local/share/nautilus/scripts/share-http.bash 
#!/bin/bash

port=8080
pkill woof
file=`echo -n $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS|sed 's/\ *$//'|sed 's/\ /\\\ /g'`
echo $file >> ~/tmp
woof -c 4 -p $port \'$file\' &
# woof -c 4 -p $port $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS &
url=`ifconfig|awk '/inet /&&!/127./{print $2}'|sed 's/.*://'`
qrencode -s 5 -o /tmp/url.png "http://$url:$port"
eog /tmp/url.png && pkill woof

Для этого сценария нужен woof+qrencode для выполнения.

Я нахожу строку $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS имеет суффиксное пространство, таким образом, я изменяю код.

В ударе это должно работать:

▶ woof -c 4 -p 8080 '/home/eexp/Download/IMG_20161024_132 037.jpg'

но это все еще перестало работать. Вы видите, что команды в PS имеют апостроф, даже если он имеет обратную косую черту перед пространством.

▶ pgrep woof
13109 /usr/bin/python /usr/bin/woof -c 4 -p 8080 '/home/eexp/Download/IMG_20161024_132 037.jpg'
▶ pgrep woof
13531 /usr/bin/python /usr/bin/woof -c 4 -p 8080 '/home/eexp/Download/IMG_20161024_132\ 037.jpg'
0
задан 1 February 2017 в 09:02

2 ответа

Я решил это. Этот $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS имеет суффикс "\x0A", таким образом, я обновляю сценарий, и все идет хорошо.

#!/bin/bash

port=8080
pkill woof
file=`echo -n $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS|sed 's/\x0A//g'`
echo "->$file<-" >> ~/tmp
woof -c 4 -p $port "$file" &
url=`ifconfig|awk '/inet /&&!/127./{print $2}'|sed 's/.*://'`
qrencode -s 5 -o /tmp/url.png "http://$url:$port"
eog /tmp/url.png && pkill woof
0
ответ дан 28 September 2019 в 05:21

В GNU/Linux что-либо кроме / и \0 (ASCII NUL), позволяются как допустимый символ составляющей имени файла. Так пространство, вкладка, даже новая строка является допустимыми символами составляющей имени файла. Когда у Вас есть любое такое имя файла, необходимо использовать любой тривиальный механизм выхода для получения буквального значения символа (символов).

Например, для имени файла как:

foo bar spam.txt

можно использовать одинарные кавычки, двойные кавычки или \ для выхода из пробелов:

'foo bar spam.txt'
"foo bar spam.txt"
foo\ bar\ spam.txt

как одинарные кавычки рекомендуют с именем файла как foo $bar spam.txt при использовании двойных кавычек, оболочка возьмет $bar как переменное расширение, то же идет для незавершенного $ при использовании \.

Без выхода оболочка выполнит разделение слова на основе значений IFS переменная среды (пространство, вкладка, новая строка по умолчанию), и расширение пути на строке (если существует кто-либо *, ?, [] в имени файла).

В случае, если переменная, Вам нужно к двойной кавычке переменное расширение:

file='foo bar spam.txt'
echo "$file"

Простой $file снова попадется на разделение слова (и расширение пути).

1
ответ дан 28 September 2019 в 05:21

Другие вопросы по тегам:

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