在 shell 脚本中挂载失败

Nar*_*adu 3 bash mount

我做了一个非常简单的shell脚本:

#!/bin/bash
/usr/bin/mount -v --bind "\""$1"\"" "\""$2"\""
echo $?
exit 0
Run Code Online (Sandbox Code Playgroud)

脚本执行失败,错误代码为 1:

./mymount "/storage/Some folder" "/storage/temp"
Run Code Online (Sandbox Code Playgroud)

从命令行工作正常:

mount -v --bind "/storage/Some folder" "/storage/temp"
Run Code Online (Sandbox Code Playgroud)

Selinux 被禁用。

我错过了什么吗?

ter*_*don 14

每当您遇到此类问题时,set -x就是您的朋友。将您的脚本更改为此并再次运行它:

#!/bin/bash
set -x
/usr/bin/mount -v --bind "\""$1"\"" "\""$2"\""
echo $?
exit 0
Run Code Online (Sandbox Code Playgroud)

这将显示以下输出:

terdon@tpad ~ $ sudo foo.sh "/storage/Some folder" "/storage/temp"
+ /usr/bin/mount -v --bind '"/storage/Some' 'folder"' '"/storage/temp"'
mount: bad usage
Try 'mount --help' for more information.
+ echo 1
1
+ exit 0
Run Code Online (Sandbox Code Playgroud)

如您所见,实际运行的是:

/usr/bin/mount -v --bind '"/storage/Some' 'folder"' '"/storage/temp"'
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为你有"\""$1"\"",所以,而不是$1,传递给的mount"$1"包括引号,就好像它们是目录名称的一部分。你想要做的是:

#!/bin/bash
set -x
/usr/bin/mount -v --bind "$1" "$2"
echo $?
exit 0
Run Code Online (Sandbox Code Playgroud)