Как «сериализовать» и «десериализовать» аргументы командной строки в / из строки? - PullRequest
4 голосов
/ 18 июня 2010

Я называю свой сценарий:

$ ./script 'a!#*`*&
^$' "sdf sdf\"qw sdsdf" 1 -- 2 3

Получает аргументы:

1: a!#*`*&
^$
2: sdf sdf"qw sdsdf
3: 1
4: --
5: 2
6: 3

Если мне нужно вызвать что-то с теми же аргументами локально, я делаю это:

someprogram "$@"

Но как я могу поместить весь этот массив в строку (чтобы сохранить в файле или в переменной среды или передать через TCP eaisly), а затем вернуть его обратно в аргументы командной строки? Я хочу, чтобы это было просто, коротко и безопасно.

export CMDLINE="$@"
# What is in CMDLINE now? Escaped or not?

sh -c "someprogram $CMDLINE"
# Will it do what I mean?

В идеале мне нужны две программы: первая преобразует параметры командной строки в строку [a-zA-Z0-9_]*, а другая - в параметры командной строки, которые я могу использовать.

Обновление: написано 2 версии пар сценариев. Что более полезно?

Ответы [ 2 ]

1 голос
/ 18 июня 2010

Создано два сценария: один сериализует свои аргументы в [a-ZA-Z0-9=_]* строки http://vi -server.org / vi / bin / serialize.sh , другой запускает эту командную строку (с необязательными предварительно добавленными аргументами)http://vi -server.org / vi / bin / deserialize.sh .

Сериализация:

#!/bin/bash
n=$#;
for ((i=0; i<$n; ++i)); do
    if [ -z "$1" ]; then
        echo 1
    else
        printf '%s' "$1" | base64 -w 0
        echo
    fi
    shift
done | tr '\n' '_'
echo -n "0"

Десериализация:

#!/bin/bash
if [ -z "$1" ]; then
    echo "Usage: deserialize data [optional arguments]"
    echo "Example: \"deserialize cXFx_d3d3_0 eee rrr\""
    echo "    will execute \"eee rrr qqq www\""
    exit 1;
fi

DATA="$1"; shift

i=0

for A in ${DATA//_/' '}; do
    if [ "$A" == "0" ]; then 
    break;
    fi              
    if [ "$A" == "1" ]; then 
    A=""
    fi              
    ARR[i++]=`base64 -d <<< "$A"`
done
exec "$@" "${ARR[@]}"

Пример:

deserialize `serialize qqq www` echo
0 голосов
/ 19 июня 2010

Несовместимо с Bash-скриптом в другом ответе

Скрипт для сериализации аргументов командной строки в [a-zA-Z0-9=_]* строку: http://vi -server.org / vi / bin / serialize

#!/usr/bin/perl
use MIME::Base64;
map {print encode_base64($_,'')."_" } @ARGV;

Скрипт для десериализации его обратно (при желании добавляя другие аргументы): http://vi -server.org / vi / bin / deserialize

#!/usr/bin/perl
use MIME::Base64;
if($#ARGV<0) {
    print << "EOF";
Usage: deserialize data [optional prepended arguments]
Example: deserialize \$(serialize 3 4 " 5 " "" "'6'" '`8`') echo 1 2
EOF
    exit
}
my @A = map {decode_base64($_)} split '_', shift @ARGV;
exec (@ARGV,@A);

Также существуют похожие скрипты для среды: http://vi -server.org / vi / bin / envserialize http://vi -server.org / vi / bin / envdeserialize

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