存储在变量或 echo 中时如何在 CSH 中保留换行符

问题描述 投票:0回答:1

我有一个

python
脚本,它是从
csh
脚本调用的(我无法使用
bash
)。 python 脚本打印出带有换行符的字符串,我将输出存储在 csh 变量中。但是,一旦我将其存储在变量中,我就会丢失所有换行符。以下是脚本:

python 脚本 (pcmd.py)

def main(op):
    if op == "h": # print help
        # below newline character is getting lost
        print ("Help first line\n second line.")
    else:  # print and later execute csh commands
        print ("setenv SOME_ENV_VAR 123; setenv ANOTHER asd")

if __name__ == "__main__":
    import sys
    main(sys.argv[1])

csh 脚本 (pcmd.csh)

# store the py script in a variable
set pcmd="./pcmd.py $*"
# store the output of the first eval command
set output=`eval "$pcmd"`
# if output contains setenv, eval the output (csh commands)
if ( "$output" =~ *setenv* ) then
    eval "${output}"
else # otherwise, print the output
    echo "${output}"  # Issue : losing newline chars, tried echo -e too but of no avail

执行

pcmd.csh h
expects: Help first line
second line.

actual: Help first line second line.  # missing newline character

有人可以指出脚本中缺少的部分,任何帮助将不胜感激。

干杯, DD

python echo csh
1个回答
0
投票

这就是 csh 的行为方式。从其手册页:

命令替换由“”括起来的命令表示。这 此类命令的输出在空白处被分解为单独的单词, 制表符和换行符以及空字将被丢弃。输出是 变量和命令被替换并代替原来的位置 字符串。

双引号 (`"') 内的命令替换保留空格并 选项卡;只有换行符才会强制产生新单词。最后的单个换行符确实 无论如何不要强行使用新词。因此可以使用命令 替换仅产生单词的一部分,即使命令输出 一条完整的线。

默认情况下,从 6.12 版本开始,shell 会替换所有换行符和 命令中的回车符由空格组成。如果这是 通过取消设置 csubstnonl 来关闭,换行符将命令分隔为 平常。

我最后一次使用 csh 是在 20 世纪 80 年代中期。我不相信你想做的事情是可能的。 Csh 是一个可怕的 shell。甚至比 Bash 这样的 POSIX shell 还要糟糕。即使您不能使用 Bash,是否有某些原因不能使用 /bin/sh?或者,更好的是,像 Fish 或 Elvish 这样的现代理智 shell?

© www.soinside.com 2019 - 2024. All rights reserved.