gpt4 book ai didi

linux - 运行远程脚本的意外行为

转载 作者:太空宇宙 更新时间:2023-11-04 10:04:41 24 4
gpt4 key购买 nike

我正在尝试编写一个在远程机器上运行的脚本。

由于这个脚本很复杂,我将它的一部分分解为函数,然后使用 typeset 将这些函数复制到脚本中。

当我运行脚本时,出现以下错误:

bash: -c: 第 4 行:语法错误:意外的文件结尾

但是,没有意外的文件结束!我确保所有 if 都有 fi,所有 { 都有 },等等。

我已确保所有缩进都使用制表符(和空格),并确保换行符一致。

我已将代码简化为一个最小的示例。似乎一个函数要有效,它需要以 if fiwhile done< 这样的结构结束.

这是不起作用的地方。

func() {
ls ~/
}

ssh -A -T user@machine_ip '
'$(typeset -f func)'
func
'

第 4 行与 func 函数的末尾 重合(从 ssh -A -T... 之后开始计算行数,如下所示远程机器上发生错误)。

然而,如果我们在函数末尾添加一个构造,主目录将按预期打印。

func() {
ls ~/
if [[ 1 ]]; then
echo "Hello"
fi
}

func() {
ls ~/
while false; do
echo "Here"
done
}

typeset -f func 的输出是

func () 
{
ls --color=auto ~/;
if [[ -n 1 ]]; then
echo "Hello";
fi
}

我正在运行 Ubuntu 18.04 LTS,远程计算机正在运行 Centos 6。

最佳答案

因为如果你愿意,bash 会使用空格。让我解释一下:

$(typeset -f func) 将评估 typeset -f func 并将其输出插入当前命令行。如果不加引号,它也会分段成参数,这会产生一个副作用,即所有空格都折叠成一个空格。因此,如果 typeset -f func 打印(就像在我的系统上一样)

func () 
{
/bin/ls --color=auto ~/
}

你用$(typeset -f func)得到的是

func () { /bin/ls --color=auto ~/ }

(如果你不相信我,试试 echo $(typeset -f func) :D )

现在,bash 对接受乱七八糟的代码真的很害羞。例如,您可能知道这不符合语法:

if true then echo "yes" fi

这是:

if true; then echo "yes"; fi

同样,函数定义的右括号也是挑剔的。因此,这有效:

func () { /bin/ls --color=auto ~/; }

但这不是:

func () { /bin/ls --color=auto ~/ }

出于某种原因,bash 可以在括号前加上关键字:

func () { /bin/ls --color=auto ~/; if [[ -n 1 ]]; then echo "Hello"; fi }
func () { /bin/ls --color=auto ~/; while false; do echo "Here"; done }

为了解决这个问题......尽量不要从命令行发送内容,这会破坏你的空白,而是从重定向发送:

ssh -A -T user@machine_ip < <(typeset -f func; echo func)

或者,最简单的方法是,使用双引号防止 bash 对空格进行处理:

ssh -A -T user@machine_ip "$(typeset -f func)
func"

关于linux - 运行远程脚本的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53408459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com