Argumentos de eco para um arquivo de log formatado com aspas duplas em torno dos argumentos

3

Ubuntu 16.04

Eu estou querendo ecoar o comando original para um arquivo de log. Meu arquivo de log deve se parecer com isso:

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 realizar isso enquanto satisfaz 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

Eu não posso ir com a primeira linha porque eu teria que saber os argumentos antes do tempo.

Isso é o que o console diz quando eu 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"
    
por needtoknow 17.04.2018 / 00:36

3 respostas

2

Você pode obter uma saída shell-quoted usando o @Q modificador de expansão no Bash 4.4 e posterior:

$ echo "$timeStamp" -  Executing command: sudo /home/editini.sh "${@@Q}"
Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh 'one' 'two' 'three' 'four' 'five' 'six'

Ele usa aspas simples, em vez de duplas, mas garante que a saída seja válida como entrada de volta para o shell que faz o que você espera. Um exemplo de onde isso é importante está abaixo, mas se o seu formato de log requerer aspas duplas, não é útil.

Um pouco confuso, ${@@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. O modificador Q faz com que a saída seja citada. $@ se expande para cada elemento individualmente, diferente de $* , mas provavelmente não importa neste caso (embora isso possa acontecer se o seu código real for mais complexo).

@Q e printf %q , usam aspas simples porque elas inibem outras expansões de shell - se um dos argumentos tiver $ , ' , \ , " ou ! em qualquer coisa com aspas duplas será suspeita. @Q garante que o termo every seja citado, mesmo que não exija necessariamente (enquanto printf não o exige). Os espaços ainda são manipulados corretamente.

$ set -- 'o$ne' "t w o" th\'ree fo\ur five\! s\"i\'x
$ echo "$timeStamp" -  Executing command: sudo /home/editini.sh "${@@Q}"
Mon 04/16/18 04-05-pm - Executing command: sudo /home/editini.sh 'o$ne' 't w o' 'th'ree' 'fo\ur' 'five!' 's"i'\''x'

Você poderia copiar esse comando de volta e ele simplesmente funcionaria, não importando o quanto a entrada fosse perversa.

    
por 17.04.2018 / 01:26
0

Isso parece funcionar:

#!/bin/bash

a=$(parallel --shellquote ::: "$@")
echo "$timeStamp" -  Executing command: sudo /home/editini.sh $a

Testado com:

mylog '"I  want  a  2"x4"", said the 3 * captain"' to his friend

Não será citado com ", porque (como você pode ver no teste)" pode ser parte da entrada. Ele usa \ em vez disso. A função de citação de shell no GNU Parallel é testada extensivamente, então eu ficarei surpreso se você puder dar uma entrada que será citada erroneamente.

    
por 17.04.2018 / 00:53
0

Use um loop simples

{
   echo -n "$timeStamp - Executing command: sudo /home/editini.sh"
   for a in "$@"
   do
     echo -n " \"$a\""
   done
   echo
} > report.txt

por exemplo

./x one two "three and four together" five    
Mon 04/16/18 04-46-pm - Executing command: sudo /home/editini.sh "one" "two" "three and four together" "five"

A única coisa que irá quebrá-lo é se a entrada tiver um "

% ./x one "two\"three" four
Mon 04/16/18 04-21-pm - Executing command: sudo /home/editini.sh "one" "two"three" "four"
    
por 17.04.2018 / 01:03