Eu gostaria de extrair os comandos de scripts de shell arbitrários. Eu usei o morbig (dica para Michael Homer pela sugestão!) para gerar um arquivo JSON a partir de um script de shell.
Como exemplo, este script de shell:
#!/bin/sh
echo hi
false || echo something
true && echo something
resulta no seguinte JSON:
[
"Program_LineBreak_CompleteCommands_LineBreak",
[ "LineBreak_Empty" ],
[
"CompleteCommands_CompleteCommands_NewlineList_CompleteCommand",
[
"CompleteCommands_CompleteCommands_NewlineList_CompleteCommand",
[
"CompleteCommands_CompleteCommand",
[
"CompleteCommand_CList",
[
"CList_AndOr",
[
"AndOr_Pipeline",
[
"Pipeline_PipeSequence",
[
"PipeSequence_Command",
[
"Command_SimpleCommand",
[
"SimpleCommand_CmdName_CmdSuffix",
[
"CmdName_Word",
[ "Word", "echo", [ [ "WordName", "echo" ] ] ]
],
[
"CmdSuffix_Word",
[ "Word", "hi", [ [ "WordName", "hi" ] ] ]
]
]
]
]
]
]
]
]
],
[ "NewLineList_NewLine" ],
[
"CompleteCommand_CList",
[
"CList_AndOr",
[
"AndOr_AndOr_OrIf_LineBreak_Pipeline",
[
"AndOr_Pipeline",
[
"Pipeline_PipeSequence",
[
"PipeSequence_Command",
[
"Command_SimpleCommand",
[
"SimpleCommand_CmdName",
[
"CmdName_Word",
[ "Word", "false", [ [ "WordName", "false" ] ] ]
]
]
]
]
]
],
[ "LineBreak_Empty" ],
[
"Pipeline_PipeSequence",
[
"PipeSequence_Command",
[
"Command_SimpleCommand",
[
"SimpleCommand_CmdName_CmdSuffix",
[
"CmdName_Word",
[ "Word", "echo", [ [ "WordName", "echo" ] ] ]
],
[
"CmdSuffix_Word",
[
"Word",
"something",
[ [ "WordName", "something" ] ]
]
]
]
]
]
]
]
]
]
],
[ "NewLineList_NewLine" ],
[
"CompleteCommand_CList",
[
"CList_AndOr",
[
"AndOr_AndOr_AndIf_LineBreak_Pipeline",
[
"AndOr_Pipeline",
[
"Pipeline_PipeSequence",
[
"PipeSequence_Command",
[
"Command_SimpleCommand",
[
"SimpleCommand_CmdName",
[
"CmdName_Word",
[ "Word", "true", [ [ "WordName", "true" ] ] ]
]
]
]
]
]
],
[ "LineBreak_Empty" ],
[
"Pipeline_PipeSequence",
[
"PipeSequence_Command",
[
"Command_SimpleCommand",
[
"SimpleCommand_CmdName_CmdSuffix",
[
"CmdName_Word",
[ "Word", "echo", [ [ "WordName", "echo" ] ] ]
],
[
"CmdSuffix_Word",
[ "Word", "something", [ [ "WordName", "something" ] ] ]
]
]
]
]
]
]
]
]
],
[ "LineBreak_Empty" ]
]
Eu gostaria de ver a saída ao longo das linhas de:
echo
false
echo
true
echo
... ignorando por enquanto quaisquer parâmetros, opções e argumentos para os comandos básicos. A ordem dos comandos de saída não importa. Pontos de bônus se for fácil torná-los únicos antes de serem enviados (salvar um |sort -u
depois).
Eu cheguei até:
< simple.json jq flatten | grep -A2 CmdName_Word
mas isso parece a abordagem errada. Eu quero dizer jq
para me dar a palavra que segue "Word" que segue "CmdName_Word", mas não sei como fazer isso.
Se você quiser reproduzir essas etapas localmente (extraído de https://github.com/colis-anr/morbig ):
(instale o docker de acordo com o seu sistema operacional)
docker pull colisanr/morbig:latest
defina uma função shell para facilidade de uso:
morbig () { D=$(cd "$(dirname "$1")"; pwd) B=$(basename "$1") docker run \ -v "$D":/mnt \ colisanr/morbig:latest --as simple /mnt/"$B" }
certifique-se de que o diretório que contém o script de shell seja gravável pelo UID 1000 (o contêiner docker é executado como usuário "opam" dentro do contêiner, que possui o UID 1000).
morbig your-shell-script-here.sh
o JSON resultante
your-shell-script-here.sh.sjson
estará no mesmo diretório que o script de shell.