使用未初始化的变量时 SCP 退出 0 并且无法复制

使用未初始化的变量时 SCP 退出 0 并且无法复制

我正在尝试测试文件是否无法使用 SCP 传输。

我注意到如果我使用未初始化的变量,即使 SCP 失败,我也得到退出 0。

例如,我有一个名为的空变量未初始化的变量

[root@centos_8_0 脚本]# echo $uninitialized_var

如果我尝试在 SCP 命令中使用它,该命令似乎可以工作,返回 exit 0,但是由于不存在路径,因此不会复制任何文件。如果我使用不存在的硬路径,它将失败。

[root@centos_8_0 脚本]# scp root@centos_8_1:/root/test/stack_test/file_20210302.csv $uninitialized_var/file_20210302.csv
file_20210302.csv 100% 0 0.0KB/秒 00:00

[root@centos_8_0 脚本]# echo $?
0

有没有办法测试复制是否成功?目前我正在使用:

  
如果 [[ $? != 0 ]]; 则...
然而就像我说的,它返回 0。

它返回 0 有什么原因吗?

答案1

shell 将扩展该变量,在本例中将其添加到 前面/file_20210302.csv。这意味着您的目标路径就是/file_20210302.csv。您正在以具有 写入权限的 root 身份执行此操作/。文件正在被复制并放置在您的根目录中,没有发生错误,因此退出状态为 0。

我用这个测试过

scp [email protected]:/home/user/test_file  $uninitialized_var/tmp/test_file

并且它按预期工作,将文件放在 /tmp 中并退出状态为 0。

答案2

假设您正在使用 bash,您可以为变量提供一个默认值,如果未设置该变量则使用该默认值。

echo ${uninitialized_var:-NOT_SET}/file_20210302.csv

如果变量未设置,它将“返回”值“NOT_SET”。
您还可以提供更合理的默认值,例如

scp root@centos_8_1:/tmp/file_20210302.csv ${uninitialized_var:-/tmp}/file_20210302.csv

如果设置了 uninitialized_var,scp 将写入该文件夹。
如果没有设置,它将文件写入 /tmp。

參閱Shell 参数扩展

相关内容