Прочитать результат printf '% q' "$ VAR" - PullRequest
4 голосов
/ 05 ноября 2011

Bash может выводить переменные как строки, экранированные оболочкой:

$ X='1 2 te$t'; Y=$' \a\n\t '; printf '%q %q\n' "$X" "$Y" > .data
$ cat .data 
1\ 2\ te\$t $' \a\n\t '

Возможно ли восстановить переменные X и Y из файла .data?Это должно быть безопасно, даже если .data содержит $(rm -rf /*).

Я ищу способ хранения записей (переменных X, Y) в формате «одна строка на запись».

РЕДАКТИРОВАТЬ

В моей задаче printf '%q' может быть заменено на urlquote из Python.Решение:

$ X='1 2 te$t'; Y=$' \a\n\t ';
$ alias urlquote="python -c'import urllib, sys; print urllib.quote(sys.stdin.read())'"
$ alias urlunquote="python -c'import urllib, sys; print urllib.unquote(sys.stdin.read())'"
$ echo $(echo -n "$X" | urlquote) $(echo -n "$Y" | urlquote) > .data
$ cat .data 
1%202%20te%24t %20%07%0A%09%20
$ while read -r x y; do
>     x=$(echo "$x" | urlunquote)
>     y=$(echo "$y" | urlunquote)
>     printf '%q %q\n' "$x" "$y"
> done < .data 
1\ 2\ te\$t $' \a\n\t '

Ответы [ 2 ]

4 голосов
/ 05 ноября 2011

Обновленный ответ:

printf Вывод% q, насколько я знаю, не может быть восстановлен без eval, и eval всегда будет уязвим для выполнения произвольной команды. Вам нужно будет использовать кодировку, напрямую не поддерживаемую bash, например, с base64:

#!/bin/bash

X='1 2 te$t';
Y=$' \a\n\t ';
echo "$(base64 -w0<<<"$X") $(base64 -w0<<<"$Y")" > .data
cat .data|while read line; do
    X2=$(base64 -d<<<${line%% *})
    Y2=$(base64 -d<<<${line#* })
    printf "%q %q\n" "$X2" "$Y2"
done

(оригинальный ответ удален, см. Историю сообщений)

1 голос
/ 05 ноября 2011

Я уверен, я бы так и сделал

X='1 2 te$t'
Y=$' \a\n\t '

{ 
     printf "X=%q" "$X"
     printf "Y=%q" "$Y"
} > .data

Затем восстановить:

source .data

EDIT

Почему бы тебе просто не

(echo "$X"; echo "$Y") > .data
readarray ENVVARS < .data

X="${ENVVARS[0]}"
Y="${ENVVARS[1]}"

Обратите внимание, что readarray требует bash 4+. Вы можете приблизить то же самое с read

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