Избегайте имен файлов так же, как это делает Bash - PullRequest
18 голосов
/ 10 апреля 2011

Когда я использую клавишу "tab" в bash (когда вы начали вводить имя файла и хотите, чтобы оно было завершено), bash правильно экранирует имя файла, и если я использую именно это "экранированное" имя файла, это работает.

Для экземпляра:

An-Beat - Mentally Insine (Original Mix).mp3 => После bash Выход из режима использования "TAB" An-Beat\ -\ Mentally\ Insine\ \(Original\ Mix\).mp3

Я ищу функциюдля bash, который будет экранировать имя файла так же, как "tab" экранирует имена файлов.

Ответы [ 5 ]

26 голосов
/ 10 апреля 2011

Использование printf (1):

x='a real \good %* load of c$rap'
x=$(printf '%q' "$x")
echo $x

вернется

a\ real\ \\good\ %\*\ load\ of\ c\$rap
5 голосов
/ 23 октября 2012

Я собираюсь уточнить ответ Сеэ на этот вопрос.

Если вы хотите передать аргумент для преобразования в качестве параметра сценария оболочки, заключите этот параметр в "'.

#!/bin/bash
x=$(printf '%q' "$1")
echo $x

Мне действительно нравится решение printf, так как оно делает каждый специальный символ, как bash.

3 голосов
/ 29 мая 2015

Решение от "sehe" работает отлично, кроме того, вы также можете использовать двойные кавычки (") вместо одиночного апострофа ('), чтобы иметь возможность использовать переменные:

x="a real \good %* load of crap from ${USER}"
echo $(printf '%q' "$x")

Конечно,Строка может не содержать $ или "сама по себе, или вы должны экранировать вручную, используя заставку \ $.

3 голосов
/ 10 апреля 2011
$ string="An-Beat - Mentally Insine (Original Mix).mp3"
$ echo ${string// /\\ }
An-Beat\ -\ Mentally\ Insine\ (Original\ Mix).mp3
$ string=${string// /\\ }
$ echo ${string//(/\\( }
An-Beat - Mentally Insine \( Original Mix).mp3
2 голосов
/ 30 октября 2018
ls  --quoting-style=escape /somedir

это выведет экранированные имена файлов, а также будет работать с символами юникода, метод printf не работает с китайским языком, он выводит что-то вроде $ '\ 206 \ 305 ...'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...