命令在脚本文件中不起作用,但在 shell 命令中可以正常工作

命令在脚本文件中不起作用,但在 shell 命令中可以正常工作

我正在 shell 中运行一个命令。它在 shell 中运行正常。我的意思是仅在终端中。但我需要从脚本文件运行它。当我从脚本运行它时,命令的一个选项中指定的文件不可访问。它给出的错误与文件路径不正确时相同。命令和脚本中的文件路径是绝对的。我还尝试了路径的不同变体 - 在根文件夹中,前面有 ~,不同的绝对路径。

我创建了一个脚本文件,以 #!/bin/bash 开头,然后在下一行输入命令。尝试像这样执行它:

sudo sh script.sh
sudo bash script.sh
sudo dash script.sh
. ./script.sh

还尝试将第一行更改为

#!/bin/bash
#!/bin/sh
#!/bin/dash
#!/bin/env sh
#!/bin/env bash
#!/bin/env dash

尝试将标题行和运行命令的所有组合组合起来。结果都一样。

从脚本文件运行时,选项中传递的文件不可访问。但完全相同的命令在 shell 中完美运行。选项中传递的文件具有绝对路径,例如 /home/ubuntu/file

我也得到了这个输出

ubuntu@ip-XXX-XXX-XXX-XXX:~$ file -h /bin/sh
/bin/sh: symbolic link to dash

ubuntu@ip-172-30-2-170:~$ file -h /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), 
dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, 
BuildID[sha1]=452da38d6212b692cd80eb0dd1c99cf853da31ae, stripped

ubuntu@ip-172-30-2-170:~$ file -h /bin/dash
/bin/dash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), 
dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, 
BuildID[sha1]=a783260e3a5fe0afdae77417eea7fbf8d645219e, stripped

更新:我正在运行的命令是 s3fs。该命令用于将 s3 bucket 作为文件夹挂载到 AWS 实例上。我想让它在实例启动/重启时自动挂载,并考虑使用 cron 的 @reboot 运行该脚本

就这个:

sudo /usr/local/bin/s3fs s3bucketname /home/ubuntu/bucketmountfolder -o allow_other -o uid=1000 -o mp_umask=002 -o multireq_max=5 -o use_path_request_style -o url=<myurl> -o passwd_file=/home/ubuntu/passwd

更新2:

我已通过删除选项并在默认密码文件 .passwd-s3fs 中设置凭据解决了密码文件问题。现在,没有密码文件选项,该命令在 shell 脚本中运行良好,但在 shell 脚本文件中无法运行,问题相同。

更新3:

我的脚本文件是这样的:

#!/bin/bash
echo 'starting mount script'
sudo /usr/local/bin/s3fs s3bucketname /home/ubuntu/s3bucketmountfolder -o allow_other -o uid=1000 -o mp_umask=002 -o multireq_max=5 -o use_path_request_style -o url=<my url> -o dbglevel=info -f -o curldbg
echo 'mount script done'

在命令中添加调试选项会在脚本文件中运行时给出这样的输出:

ubuntu@ip-172-30-2-170:~$ . ./automount.sh
starting mount script
[CRT] s3fs.cpp:set_s3fs_log_level(297): change debug level from [CRT] to 
[INF]
[INF]     s3fs.cpp:set_mountpoint_attribute(4382): PROC(uid=0, gid=0) - 
MountPoint(uid=1000, gid=1000, mode=40775)
'use: unknown option `curldbg
mount script done

如果没有调试选项,它就像这样:

ubuntu@ip-172-30-2-170:~$ . ./automount.sh
starting mount script
mount script done

在shell中,带有调试选项的命令给出了大约50行日志。

答案1

'use: unknown option `curldbg

我怀疑这一行是实际打印的结果:

fuse: unknown option `curldbg<CR>'

<CR>是回车符,导致尾随的撇号覆盖行首。

确保您的脚本包含 Unix 风格的换行符(仅限 NL)。


另请注意

  • . ./script.sh(又名source ./script.sh),
  • bash ./script.sh(或者any_other_shell ./script.sh),
  • ./script.sh

调用脚本有三种截然不同的方法。通常,您应该采用第三种方法(以及脚本上的可执行部分)。这也是这三种方法中唯一一种#!/blahshebang 行很重要的方法。

#!/bin/env sh

如果您为 shebang line 选择这种方法,则需要/usr/bin/env而不是/bin/env

相关内容