Сохранять аргументы оболочки в файле при сохранении цитирования - PullRequest
3 голосов
/ 20 мая 2011

Как сохранить аргументы оболочки в файле для последующего использования при сохранении кавычек?

Для ясности: я не хочу передавать аргументы на месте, что можно легко сделать с помощью "$@". Но на самом деле нужно , чтобы сохранить их в файле для позже использования.

#!/bin/sh
storeargs() {
    : #-)
}
if "$1"
then
    # useargs is actuall 'git filter-branch'
    useargs "$@"
    storeargs "$@"
else
    # without args use those from previous invocation
    eval useargs $(cat store)
fi

.

$ foo 'a "b"' "c 'd'" '\'' 'd
e'
$ foo # behave as if called with same arguments again

Вопрос, вероятно, сводится к тому, как заключить в кавычки строку, используя общие инструменты в целом (awk, perl, ...). Я бы предпочел решение, которое не делает цитируемую строку нечитаемой. Содержимое store должно выглядеть более или менее так, как я бы указал в командной строке.

Вопрос осложняется тем фактом, что цитируемые аргументы / строки могут уже содержать любые допустимые (shell) кавычки и / или любые (существенные) пробелы, поэтому без всяких условий ставьте одинарные или двойные кавычки вокруг каждого аргумента. или сохранение одного аргумента в строке не сработает.

Ответы [ 2 ]

5 голосов
/ 20 мая 2011

Почему тяжелые работы?

storeargs() {
     while [ $# -gt 0 ]
     do 
         printf "%q " "$1"
         shift
     done   
}

Теперь вы можете

storeargs "some" "weird $1 \`bunch\` of" params >  myparams.txt
storeargs "some" 'weird $1 \`bunch\` of' params >> myparams.txt
cat myparams.txt

Вывод

some weird\ \ \`bunch\`\ of params
some weird\ \$1\ \\\`bunch\\\`\ of params
1 голос
/ 20 мая 2011

Эта версия хранит аргументы по одному на строку, поэтому может быть немного уродливой с точки зрения хранения.Я сомневаюсь, что он полностью устойчив, но он удовлетворяет вашему примеру (для useargs () {для i в "$ @"; do echo $ i; done;}):

storeargs() { printf "%q\n" "$@"; } > store

if test -n "$1"; then
  useargs "$@"
  storeargs "$@"
else
  eval useargs $args
fi

- EDIT-- Используйте% q в printf, чтобы заключить строки в кавычки (беззастенчиво скопировано из ответа sehe).Обратите внимание, что% q доступен во встроенном printf bash, но не в стандартном printf.

...