Я записал сценарий удара и вставил его ~/.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'
Я решил это. Этот $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
В 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
снова попадется на разделение слова (и расширение пути).