2017-07-25 2 views
1

J'essaye de porter un script bash existant vers Solaris et FreeBSD. Cela fonctionne très bien sur Fedora et Ubuntu.Problème de portage de script bash lié au programme de script

Ce script bash utilise l'ensemble de commandes suivant pour vider la sortie vers le fichier temporaire.

file=$(mktemp) 
    # record test_program output into a temp file 
    script -qfc "test_program arg1" "$file" </dev/null & 

Le programme de script n'a pas d'options -qfc sur FreeBSD et Solaris. Sous Solaris et FreeBSD, le programme de script n'a d'option -a. J'ai fait ce qui suit jusqu'à maintenant:

1) mise à jour vers la dernière version de bash. Cela n'a pas aidé.

2) Essayez de savoir où se trouve exactement le code source du programme "script". Je ne pouvais pas le trouver non plus.

Quelqu'un peut-il m'aider ici?

+1

https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/tree/term-utils/ script.c – melpomene

+3

Pourquoi est-il nécessaire de capturer la sortie avec 'script'? Généralement, le programme est utilisé pour des sessions interactives. Si vous voulez juste capturer stdout et stderr utilisez la redirection '>" $ file "2> & 1' à la place. – ceving

+0

Je pense que la sortie du programme n'est pas immédiatement vidée. C'est pourquoi le programme de script est utilisé. –

Répondre

2

scriptscript est un programme autonome, ne fait pas partie du shell, et comme vous l'avez remarqué, seul le drapeau -a est disponible dans toutes les variantes. La version FreeBSD supporte quelque chose de similaire à -f (-F <file>) et n'a pas besoin de -c.

est ici une solution laid, mais plus portable:

buildsh() { 
    cat <<-! 
     #!/bin/sh 
     SHELL="$SHELL" exec \\ 
    ! 
    # Build quoted argument list 
    while [ $# != 0 ]; do echo "$1"; shift; done | 
    sed 's/'\''/'\'\\\\\'\''/g;s/^/'\''/;s/$/'\''/;!$s/$/ \\/' 
} 

# Build a shell script with the arguments and run it within `script` 
record() { 
    local F t="$(mktemp)" f="$1" 
    shift 
    case "$(uname -s)" in 
     Linux) F=-f ;; 
     FreeBSD) F=-F ;; 
    esac 
    buildsh "[email protected]" > "$t" && 
    chmod 500 "$t" && 
    SHELL="$t" script $F "$f" /dev/null 
    rm -f "$t" 
    sed -i '1d;$d' "$f" # Emulate -q 
} 

file=$(mktemp) 
# record test_program output into a temp file 
record "$file" test_program arg1 </dev/null & 
+0

Merci Ismael. Je vais essayer ça. –