返回

在 CSH 中保留换行符:解决跨 Python 和 CSH 的换行符丢失问题

python

在 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 中保留了换行符。这种方法为跨脚本通信提供了一个稳健且有效的解决方案,解决了在存储或回显变量时丢失换行符的问题。

常见问题解答

  1. 为什么在 CSH 中默认丢失换行符?
    CSH 会将换行符视为命令分隔符。当将包含换行符的字符串存储在变量中时,CSH 会将其视为多个命令,从而破坏了字符串的完整性。

  2. 还有其他方法可以在 CSH 中保留换行符吗?
    有其他方法,例如使用转义序列或 $' 反引号语法,但它们比使用 subprocesscat` 方法更复杂且容易出错。

  3. 这个解决方案是否适用于其他 shell 环境?
    是的,这个解决方案不仅适用于 CSH,还适用于其他 shell 环境,如 Bash 和 ZSH,它们在处理换行符时有类似的行为。

  4. 为什么使用 echo 命令而不是 cat 命令在 Python 脚本中打印输出?
    echo 命令用于打印文本,而 cat 命令用于打印文件内容。在我们的情况下,我们希望直接打印文本,而不是通过文件重定向。

  5. 这个解决方案是否仅适用于 Linux 环境?
    这个解决方案不限于 Linux 环境。它在其他操作系统上也适用,如 macOS 和 Windows(使用 Cygwin 或类似工具)。