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 &
我正在尝试将现有的 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 &