bash 与脚本程序相关的脚本移植问题

bash script porting issue related to script program

我正在尝试将现有的 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) 尝试找出"script"程序的源代码到底在哪里。我也没找到。

有人可以帮我吗?

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

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

buildsh() {
    cat <<-!
        #!/bin/sh
        SHELL="$SHELL" exec \
    !
    # Build quoted argument list
    while [ $# != 0 ]; do echo ""; 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=""
    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 &