linux - 检查 scp 命令的状态代码,如果失败,则在另一台机器上调用 scp

标签 linux bash shell unix scp

下面是我的 shell 脚本片段,我在其中执行 scp 命令将文件从 machineB 复制到 machineA

for element in ${x[$key]}; do   # no quotes here
    printf "%s\t%s\n" "$key" "$element"
    if [ $key -eq 0 ]
    then
        scp david@machineB:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/.
    fi    
done

我有一个非常简单的问题,如下所述 -

如果我的 shell 脚本中的上述 scp 命令出于任何原因给我这个错误 - No such file or directory 然后我需要尝试从 machineC 执行 scp 并且对于那个 scp 命令将是这样的,只有机器会不同,其他一切都会相同 -

scp david@machineC:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/.

所以我的问题是如何在我的 shell 脚本中检查上述 scp 命令的输出,然后决定我是否需要从 machineC 调用 scp 命令?是否有任何状态类型的东西我可以用来检查,如果它由于某种原因失败了,那么我可以在 machineC 上调用 scp 命令吗?

这可以在 shell 脚本中完成吗?

最佳答案

给你:

for element in ${x[$key]}; do   # no quotes here
    printf "%s\t%s\n" "$key" "$element"
    if [ $key -eq 0 ]
    then
        scp david@machineB:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/. || scp david@machineB:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/
    fi    
done

如果操作成功,则行为良好的命令将以“成功”(退出代码 = 0)退出,否则将以退出代码 != 0 退出。您可以像这样将命令链接在一起:

cmd && echo successful || echo failed
cmd && keep going || do something else

退出代码也存储在 $? 变量中,所以这是等价的:

cmd; if $? = 0; then echo successful; else echo failed; fi

不仅这是可能的,命令的状态代码在 shell 脚本中非常重要。考虑这两个例子:

./configure && make && make install
./configure; make; make install

如果全部成功,第一个将执行命令链。第二个命令将始终执行所有命令,即使之前的命令失败也是如此。

关于linux - 检查 scp 命令的状态代码,如果失败,则在另一台机器上调用 scp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20627207/

相关文章:

linux - 关闭对文件夹的访问,但打开对文件的访问

linux - 检查 bash 脚本上的 AWS cli 版本

bash - 创建一个在 Go 中运行任意 shell 命令的函数

linux - 如何删除 root 拥有的名称中包含空格的文件?

linux - shell 脚本中的返回值竞争条件

c - ISO的C标准库中有函数strcmp吗?

linux - 使用 inittab 中的 respawn 条目重新启动 linux 应用程序不起作用

linux - 除了凌晨 3 点外,Crontab 每 15 分钟运行一次?

php - 从 shell 脚本中的 php 脚本检索退出状态

linux - 在 dhcpd.conf 中查找空闲 IP 地址