Ubuntu 16.04
Estou querendo ecoar o comando original em um arquivo de log. Meu arquivo de log deve ser algo como isto:
Mon 04/16/18 04-24-pm - Executing command: sudo /home/editini.sh "one" "two" "three" "four" "five" "six"
Qual seria a maneira mais fácil de fazer isso enquanto satisfazia a verificação ortográfica ao mesmo tempo.
#!/bin/bash
hello="${1}"
my="$2"
friend="$3"
are="$4"
you="$5"
safe="$6"
timeStamp="$(date '+%a %D %m-%S-%P')"
rm -rf report*; touch report.txt;
{
echo "$timeStamp - Executing command: sudo /home/editini.sh \"$hello\" \"$my\" \"$friend\" \"$are\" \"$you\" \"$safe\""
echo ""
echo "$timeStamp" - Executing command: sudo /home/editini.sh "$*"
echo "";
echo "$timeStamp" - Executing command: sudo /home/editini.sh \""$*"\"
echo "";
} > report.txt
cat report.txt
Não posso ir com a primeira linha porque teria que conhecer os argumentos antes do tempo.
Isso é o que o console diz quando executo os comandos acima.
root@me /home/scripts/vent-commands # sh one.sh one two three four five six
Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh "one" "two" "three" "four" "five" "six"
Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh one two three four five six
Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh "one two three four five six"
Você pode obter uma saída entre aspas usando o
@Q
modificador de expansão no Bash 4.4 e posterior:Ele usa aspas simples, em vez de duplas, mas garante que a saída seja válida como entrada de volta no shell que faz o que você espera. Um exemplo de onde isso importa está abaixo, mas se o formato do seu log exigir aspas duplas, não será útil.
De forma um tanto confusa,
${@@Q}
usa o@
para dois significados diferentes em caracteres consecutivos: o primeiro@
representa o array de argumentos, enquanto o segundo introduz um modificador que transforma a saída da expansão do array. OQ
modificador faz com que a saída seja cotada.$@
expande para cada turno de elemento individualmente, ao contrário$*
de , mas provavelmente não importa neste caso (embora possa se o seu código real for mais complexo).@Q
, eprintf %q
, usam aspas simples porque inibem outras expansões de shell - se um dos argumentos tiver um$
,`
,\
,"
ou!
nele, qualquer coisa com aspas duplas será suspeita.@Q
garante que todos os termos sejam citados, mesmo que não o exija necessariamente (enquantoprintf
não). Os espaços ainda são tratados corretamente.Você poderia copiar esse comando de volta e ele simplesmente funcionaria, não importa o quão perversa fosse a entrada.
Isso parece funcionar:
Testado com:
Ele não irá citar ", porque (como você pode ver no teste) " pode fazer parte da entrada. Em vez disso, ele usa \. A função de citação do shell no GNU Parallel é testada extensivamente, então ficarei surpreso se você puder fornecer uma entrada que será citada incorretamente.
Use um loop simples
por exemplo
A única coisa que vai quebrá-lo é se a entrada tiver um
"
nele