检查复制的文件是否存在以及是否与源不同

时间:2018-06-18 16:42:49

标签: bash shell powerpc

我有这个脚本目前在我们的x86_64服务器下运行,但是当我们尝试在ppc64服务器上运行时它不起作用:

HOME=$(eval echo ~$(whoami))
CACHE_DIR="$HOME/.jenkins/cache/archive"
CACHE_PATH="$CACHE_DIR"

if [ ! -d $CACHE_PATH ]
 then
   mkdir -p $CACHE_PATH
fi

if output=$(cmp --s requirements.txt $CACHE_PATH/requirements.txt)
then
 echo "cached"
else
 echo "build"
 cp requirements.txt $CACHE_PATH/requirements.txt
fi

x86_64的输出

ubuntu@x86_agent:~$ bash tester.sh 
build
ubuntu@x86_agent:~$ bash tester.sh 
cached

ppc64le的输出(目标文件夹始终为空)

[xx@ppce64_agent /u/tpereira]$ bash testing.sh 
cached
[xx@ppce64_agent /u/tpereira]$ bash testing.sh 
cached

2 个答案:

答案 0 :(得分:1)

我怀疑这是一个架构问题。难道你的软件版本略有不同(bash,cmp等)以不同的方式处理你脚本中的奇怪之处吗?

怪异

删除HOME=$(eval echo ~$(whoami))HOME是一个内置变量,应该由bash自动设置。将变量命名为小写以避免此类名称冲突。 此外,~默认为当前用户的主目录。你可以写cacheDir=~/.jenkins/cache/archive

if output=$(cmp --s requirements.txt $CACHE_PATH/requirements.txt)中有两个问题。

  • -s选项应该只有一个短划线,而不是两个。
  • 为什么在指定时存储命令的输出,不应该有任何输出(-s)?

只需写下if cmp -s requirements.txt "$CACHE_PATH/requirements.txt"

替换

对于instace rsync,您可以使用现有的解决方案,而不是编写自己的脚本。

答案 1 :(得分:0)

你抓错了返回值。

您将变量设置为等于cmp(标准输出)的输出。 cmp不显示任何内容,它使用返回值作为答案。如果$?是最后一个命令运行,则此值将包含在cmp中,或者您可以这样做:

if cmp -s "$file1" "$file2"
then
  echo "The files match"
else
  echo "The files are different"
fi

这是有效的,因为它询问cmp是否完成没有错误。任何非零返回值都被视为错误,并转到else语句。