获取命令的 return 值 "mv -n" linux

Get return value of command "mv -n" linux

来自mv --help

-n, --no-clobber do not overwrite an existing file

user@pc:~/Desktop/test$ ls -l
total 16
-rw-r--r-- 1 user user 0 ago  6 20:28 bla
-rw-r--r-- 1 user user 0 ago  6 20:28 ble
user@pc:~/Desktop/test$ mv -n bla ble
user@pc:~/Desktop/test$

有没有办法检查命令 mv -n 的 return 值?

是否可以做类似于 $? 的事情来知道命令在移动文件时是成功 (returned 0) 还是失败 (returned 1) 因为那里目标文件夹中是否已经有另一个同名文件?

不,$? 不会告诉您 -n 选项是否阻止了 mv 执行移动,因为在这种情况下退出状态将为 0。


解决方法一:可以检查原文件没有移动...

mv -n file1 file2
[ -e file1 ] && echo "Hmmm, mv didn't have any effect"

但是,如果另一个程序在移动和测试之间同时重新创建 file1,则可能会出现竞争条件。


解决方案 2:由于您似乎使用 GNU mv-v 选项有助于确定移动是否成功

if mv -v -n file1 file2 | grep -q .; then
    echo "The move succeeded"
fi

-v一起,如果移动发生,mv将输出renamed 'file1' -> 'file2'。将其输出管道传输到 grep -q . 测试 mv 是否在其标准输出上输出任何内容。

如果有错误,mv 会输出标准错误,grep 也会失败。

比较cmd前后文件的时间戳如何。 类似于:https://github.com/shasan101/bash_for_fun/blob/master/files_comparison_by_time.sh

与其尝试移动然后测试移动是否因为目标文件存在而失败,不如在尝试移动之前测试目标文件是否存在,例如:

[[ ! -f ble ]] && mv bla ble || { ret=$?; echo "failed to move bla to ble: $ret" >&2; exit "$ret"; }

如果 ble 存在或 mv 失败,它将输出错误消息,并在失败时退出,massage 以适应,例如也许你更喜欢:

[[ -f ble ]] && { ret=$?; echo "warning ble exists so skipping it" >&2; }
[[ $ret == 0 ]] && mv bla ble

或简单的 if-else:

if [[ -f ble ]]; then
    echo "warning ble exists so skipping it" >&2
else
    mv bla ble
fi