首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查scp命令的状态代码,如果失败,则在另一台计算机上调用scp

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

Stack Overflow用户
提问于 2013-12-17 14:12:44
回答 2查看 9.3K关注 0票数 3

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

代码语言:javascript
复制
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

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

如果我的外壳脚本中的上面的scp命令由于某种原因- No such file or directory给了我这个错误,那么我需要尝试从machineC执行scp,对于这个scp命令将是这样的,只有机器是不同的,其他的都是一样的-

代码语言:javascript
复制
scp david@machineC:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/.

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

这可以在shell脚本中实现吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 14:16:09

这就是了:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
cmd && echo successful || echo failed
cmd && keep going || do something else

退出代码也存储在$?变量中,因此这是等效的:

代码语言:javascript
复制
cmd; if $? = 0; then echo successful; else echo failed; fi

不仅如此,命令的状态码在shell脚本中也非常重要。考虑以下两个示例:

代码语言:javascript
复制
./configure && make && make install
./configure; make; make install

如果所有操作都成功,则第一个命令将执行命令链。第二个命令将始终执行所有这些命令,即使前面的命令失败。

票数 2
EN

Stack Overflow用户

发布于 2013-12-17 14:24:15

scp只有在成功后才返回0。所以你可以这样写:

代码语言:javascript
复制
scp machineB:/path/toyourfile .
if [ $? -ne 0 ]
then
    scp machineC:/path/to/your/file .
fi

一种更短的方法是:

代码语言:javascript
复制
scp machineB:/path/toyourfile .
[ $? -eq 0 ] || scp machineC:/path/to/your/file .

代码语言:javascript
复制
scp machineB:/path/toyourfile .
[ $? -ne 0 ] && scp machineC:/path/to/your/file .

就我个人而言,我更喜欢更短的方法,scp输出在脚本中没有任何用处:

代码语言:javascript
复制
scp -q machineB:/path/to/your/file . || scp -q machineC:/path/to/your/file .

并且记住使用${element}而不是$element

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20627207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档