与脚本程序

时间:2017-07-25 08:47:16

标签: linux bash shell solaris freebsd

我正在尝试将现有的bash脚本移植到Solaris和FreeBSD。它在Fedora和Ubuntu上运行良好。

此bash脚本使用以下命令集将输出刷新到临时文件。

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

脚本程序在FreeBSD和Solaris上没有-qfc选项。在Solaris和FreeBSD上,脚本程序只有-a选项。到目前为止,我已经完成了以下工作:

1)更新到最新版本的bash。这没有用。

2)尝试找出“脚本”程序源代码的确切位置。我也找不到它。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

script是一个独立的程序,不是shell的一部分,正如您所注意到的,只有-a标志可用于所有变体。 FreeBSD版本支持类似于-f-F <file>)的内容,并且不需要-c

这是一个丑陋但更便携的解决方案:

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 "$@" > "$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 &