在 CSH 中保留换行符:解决跨 Python 和 CSH 的换行符丢失问题
2024-03-13 10:19:27
在 CSH 中保留换行符:跨 Python 和 CSH 的跨脚本通信指南
问题:在 CSH 中存储或回显变量时丢失换行符
在 Python 和 CSH 脚本之间进行交互时,保存带有换行符的字符串常常是一个挑战。Python 脚本输出的字符串在存储到 CSH 变量时会丢失这些换行符。这可能会导致数据完整性问题和令人困惑的输出。
解决方法:使用 subprocess 模块和 cat 命令
为了在 CSH 中保留换行符,我们采用以下策略:
1. 使用 Python 的 subprocess 模块替代 print():
在 Python 脚本中,我们将使用 subprocess
模块,它提供了对系统命令的更精细控制。我们将使用 subprocess.run()
函数来执行 echo
命令,它将直接将输出写入 shell,保留换行符。
2. 使用 CSH 的 cat 命令将输出重定向到变量:
在 CSH 脚本中,我们将使用 cat
命令将 Python 脚本的输出重定向到一个变量。cat
命令以原始格式读取文本文件并将其输出,从而保留换行符。
步骤指南
1. 修改 Python 脚本:
将 print()
调用替换为 subprocess.run()
调用,如下所示:
import subprocess
def main(op):
if op == "h": # print help
subprocess.run(["echo", "Help first line"], stdout=subprocess.PIPE)
subprocess.run(["echo", "second line."], stdout=subprocess.PIPE)
else: # print and later execute csh commands
subprocess.run(["echo", "setenv SOME_ENV_VAR 123; setenv ANOTHER asd"], stdout=subprocess.PIPE)
if __name__ == "__main__":
import sys
main(sys.argv[1])
2. 修改 CSH 脚本:
使用 cat
命令将 Python 脚本的输出重定向到变量,如下所示:
# 将 py 脚本存储在变量中
set pcmd="./pcmd.py $*"
# 使用 cat 将 py 脚本的输出重定向到变量中
set output=`cat "$pcmd"`
# 如果输出包含 setenv,则评估输出(csh 命令)
if ( "$output" =~ *setenv* ) then
eval "${output}"
else # 否则,打印输出
echo "${output}"
执行:
现在,运行 CSH 脚本,输出将保留换行符:
pcmd.csh h
期望:Help first line
second line.
实际:Help first line
second line.
结论
通过结合 Python 的 subprocess
模块和 CSH 的 cat
命令,我们成功地在 CSH 中保留了换行符。这种方法为跨脚本通信提供了一个稳健且有效的解决方案,解决了在存储或回显变量时丢失换行符的问题。
常见问题解答
-
为什么在 CSH 中默认丢失换行符?
CSH 会将换行符视为命令分隔符。当将包含换行符的字符串存储在变量中时,CSH 会将其视为多个命令,从而破坏了字符串的完整性。 -
还有其他方法可以在 CSH 中保留换行符吗?
有其他方法,例如使用转义序列或$' 反引号语法,但它们比使用
subprocess和
cat` 方法更复杂且容易出错。 -
这个解决方案是否适用于其他 shell 环境?
是的,这个解决方案不仅适用于 CSH,还适用于其他 shell 环境,如 Bash 和 ZSH,它们在处理换行符时有类似的行为。 -
为什么使用
echo
命令而不是cat
命令在 Python 脚本中打印输出?
echo
命令用于打印文本,而cat
命令用于打印文件内容。在我们的情况下,我们希望直接打印文本,而不是通过文件重定向。 -
这个解决方案是否仅适用于 Linux 环境?
这个解决方案不限于 Linux 环境。它在其他操作系统上也适用,如 macOS 和 Windows(使用 Cygwin 或类似工具)。