![命令在脚本文件中不起作用,但在 shell 命令中可以正常工作](https://linux22.com/image/1014763/%E5%91%BD%E4%BB%A4%E5%9C%A8%E8%84%9A%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%8C%E4%BD%86%E5%9C%A8%20shell%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E5%8F%AF%E4%BB%A5%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C.png)
我正在 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
调用脚本有三种截然不同的方法。通常,您应该采用第三种方法(以及脚本上的可执行部分)。这也是这三种方法中唯一一种#!/blah
shebang 行很重要的方法。
#!/bin/env sh
如果您为 shebang line 选择这种方法,则需要/usr/bin/env
而不是/bin/env
。