sh 文件中执行"$@"的问题



我正在使用sh文件从jupyterhub_config.py文件中启动一些其他命令,它基本上为用户重新创建了一个pod。

据我所知,这个问题似乎就在我重构过的sh文件中。

echo "Executing the command: $@" 
exec "$@" & tail -f /var/log/logShell/logInShell.log
echo "External user startup script finished"

所期望的行为将是$@"执行,然后logInShell.log中的日志显示在shell中。然而,尽管文件有几行,但日志从未在shell中显示。

根据我所读到的内容,运行exec将替换子流程,这让我认为它也替换了shell,这就是为什么在当前shell中从未看到tail的结果。

pod运行后,我可以看到tail命令正在使用ps -A运行。然而,这些日志根本就不会到达shell。有人知道在当前进程或shell中获取运行尾部的正确方法是什么吗?。

去掉exec关键字。您可能还需要监视正在包装的主程序何时退出,并在出现这种情况时关闭tail

#!/bin/sh
# warning: this is not actually echoing the same thing as the command you're running
echo "Executing the command: $@" 
# --follow=name --retry makes tail behave right even if the log is only created
# after tail's startup is complete; requires GNU extensions
"$@" & main_pid=$!
tail --follow=name --retry /var/log/logShell/logInShell.log & tail_pid=$!
wait "$main_pid"; main_rc=$?
echo "External user startup script finished"
kill "$tail_pid"
exit "$main_rc"

现在,关于为什么echo "Arguments are: $@"是积极误导/比无用更糟糕:

考虑./yourscript "first word" "*" "last word"——first wordlast word周围的引号对于正确理解命令行至关重要;CCD_ 9周围的引号也是如此。

但是,echo "Arguments are: $@"运行echo "Arguments are: first word" "*" "last word"——它在输出Arguments are: first word * last word上写入,完全破坏原始命令中引号所在位置的记录

如果您的shell是bash、zsh或足够现代的ksh,这是一个非致命的问题:您可以使用:而不是echo "Arguments are: $@"

# bash only
printf -v args_str '%q ' "$@"
echo "Arguments are: $args_str"

或者,使用bash 5.0或更新版本:

echo "Arguments are: ${*@Q}

但是使用基线POSIX-sh,如果你想消除歧义,最好的办法可能是将每个参数打印在第二行:

echo "Arguments are:"
printf ' - %sn' "$@"

相关内容

  • 没有找到相关文章

最新更新