Escape FileNames с использованием одного и того же пути Bash Do It

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

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

An-Beat - Mentally Insine (Original Mix).mp3 = > После bash Сбрасывает его с помощью "TAB" An-Beat\ -\ Mentally\ Insine\ \(Original\ Mix\).mp3

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

Спасибо заранее.

Ответ 1

Используйте printf (1):

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

вернет

a\ real\ \\good\ %\*\ load\ of\ c\$rap

Ответ 2

Я собираюсь подробно рассказать об этом.

Если вы хотите передать аргумент, который будет преобразован в качестве параметра оболочки script, установите параметр в ".s".

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

Мне очень нравится решение printf, так как оно имеет особый характер, как и bash.

Ответ 3

$ 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

Ответ 4

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

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

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