获取命令的 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
来自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