Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash脚本中的变量未按预期工作_Linux_Bash - Fatal编程技术网

Linux bash脚本中的变量未按预期工作

Linux bash脚本中的变量未按预期工作,linux,bash,Linux,Bash,我有这个剧本: #!/bin/bash VAR="eric.sql" sudo mysqldump -c -u username -p1234 dbname > $VAR 但如果运行此脚本,则会出现以下错误: : Protocol error 3: mysql-export.sh: cannot create eric.sql 但如果我不使用变量,只使用这个: #!/bin/bash VAR="eric.sql" sudo mysqldump -c -u username -p1234

我有这个剧本:

#!/bin/bash
VAR="eric.sql"
sudo mysqldump -c -u username -p1234 dbname > $VAR
但如果运行此脚本,则会出现以下错误:

: Protocol error 3: mysql-export.sh: cannot create eric.sql
但如果我不使用变量,只使用这个:

#!/bin/bash
VAR="eric.sql"
sudo mysqldump -c -u username -p1234 dbname > eric.sql

。。。它运行良好。我错了什么?

sudo
可以更改$PATH变量,具体取决于您的安全策略

   -E  The -E (preserve environment) option will override the env_reset
       option in sudoers(5)).  It is only available when either the match-
       ing command has the SETENV tag or the setenv option is set in sudo-
       ers(5).
您可以添加文件的完整路径,或者删除该脚本中的
sudo
。 这也应该起作用:

 sudo PATH="$PATH" mysqldump -c -u username -p1234 dbname > $VAR

问题是脚本有Windows风格的换行符(我使用记事本)。在我使用Nano编写脚本之后,问题就解决了


谢谢你的回答

你的脚本有DOS行结尾吗?Dos在其上运行
dos2unix
可以解决问题吗?旁注(主要问题几乎可以肯定,正如Etan所建议的):始终引用您的扩展<代码>>“$var”,而不是
>$var
。否则,带有空格的文件名将不起作用。另外:不要对自己的变量使用所有大写名称;按照惯例,这些名称是为shell内置和环境变量保留的;为您自己的变量使用小写名称意味着您不会覆盖错误地改变其他程序行为的内容。顺便问一下,出于好奇,这里的操作系统和文件系统是什么?大多数UNIX文件系统都允许在文件名中使用
$'\r'
(也就是换行字符)创建文件,其效果令人困惑。顺便说一句,运行
bash-x mysql export.sh
,可能会有所启发。try VAR=“$PWD/eric.sql”
$VAR
已展开,在启动
sudo
之前,打开stdout指向目的地。因此,
sudo
不可能改变重定向发生的方式。至于
PATH
——问题不是无法找到/执行
mysqldump
@CharlesDuffy,问题是它无法在该文件夹中写入文件。另外,为sudo查找
env_reset
选项。这无关紧要。shell仍然在运行
sudo
之前打开文件
sudo
无法在重定向开始之前增加其权限!您可以自己在自己的机器上测试这一点
sudo echo testing>/testing
(作为普通用户,在
/
中没有写入权限);您将看到,尽管有
sudo
,它仍然无法创建文件
/testing