1. Crie o arquivo do script do Nautilus e torne-o executável:
touch "$HOME/.local/share/nautilus/scripts/MyC++Run"
chmod +x "$HOME/.local/share/nautilus/scripts/MyC++Run"
2. Aqui está o conteúdo do script. Ele cria um script auxiliar (auto-apagado), que é executado em um novo terminal gnome, assim você pode ver as mensagens de erro dentro da janela do terminal:
#!/bin/bash -e
# Get the list of the selected in Nautilus items as an array $ITEM_LIST
IFS_BAK=$IFS
IFS=$'\t\n'
ITEM_LIST=($NAUTILUS_SCRIPT_SELECTED_FILE_PATHS)
IFS=$IFS_BAK
# Create aux script, that compile and execute the program. Run the script in gnome-terminal
compile_and_exec_program() {
OUT="${DIR}/${NAME}.out" # Define the name of the output file
AUX="${DIR}/${NAME}.bash" # Define the name of the aux script
printf '#!/bin/bash -e\n' > "${AUX}" # Create the auxiliary script
printf '%s "%s" "%s" && "%s"\n' "" "${OUT}" "${item}" "${OUT}" >> "${AUX}"
printf 'rm -f "%s"\nexec bash' "${AUX}" >> "${AUX}"
chmod +x "${AUX}" # Make the aux script exec and run it
nohup gnome-terminal -x sh -c "$(echo \'"${AUX}"\')" >/dev/null 2>&1 &
}
# For each selected item: get its name, location, etc. and proceed...
for item in "${ITEM_LIST[@]}"; do
ITEM="$(basename "${item}")" # Get the item name (exclude the path)
DIR="$(dirname "${item}")" # Get the path to the item (exclude the name)
NAME="${ITEM%.*}" # Get the name (exclude the extension)
EXT="${ITEM##*.}" # Get the extension (exclude the name)
# If the item is a file and its extension is 'c' or 'cpp', then compile and execute
if [ -f "$item" ]; then
if [ "$EXT" == "c" ]; then compile_and_exec_program "gcc -o"
elif [ "$EXT" == "cpp" ]; then compile_and_exec_program "g++ -o"
else notify-send "Wrong extension of the selected file: $ITEM"
fi
else
notify-send "The selected item is a directory: $ITEM"
fi
done
-
Explicações adicionais : O uso de um script auxiliar é a maneira mais robusta de executar mais de um comando dentro de um novo terminal-gnome, que encontrei enquanto fazia uma das minhas respostas .
Dependendo dos parâmetros de entrada da função
compile_and_exec_program
, o conteúdo gerado pela seçãoprintf
, script auxiliar, será semelhante como:#!/bin/bash -e g++ -o /work/dir/project.cpp /work/dir/output.out && /work/dir/project.out rm -f /work/dir/project.bash exec bash
Onde
&&
significa (como de costume) se o comando que está no lado esquerdo for executado com sucesso, então execute o comando que está no lado direito. A linharm -f /work/dir/project.bash
removerá o próprio script auxiliar. A última linhaexec bash
pretende mantenha aberta a nova janela do terminal gnome.Esta parte
$(echo \'"${AUX}"\')
pretende imprimir marcas de aspas simples em torno do nome do script auxiliar. É importante quando o nome do script contém alguns caracteres especiais. Eu não encontrei outra maneira de fazer isso. Outra forma de colocar apenas os espaços é usando:${AUX/\ /\ }
. -
Aqui está um script de exemplo, que cria um arquivo de log, onde você pode ver as mensagens de erro de o processo.
3. Aqui está uma demonstração (da versão anterior ) dos recursos do script :