Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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 为什么在脚本中使用“引用”;设置变量=值;打破$@?_Linux_Shell_Centos_Command Line Arguments - Fatal编程技术网

Linux 为什么在脚本中使用“引用”;设置变量=值;打破$@?

Linux 为什么在脚本中使用“引用”;设置变量=值;打破$@?,linux,shell,centos,command-line-arguments,Linux,Shell,Centos,Command Line Arguments,我正在尝试在Centos虚拟机上配置自动注销。我注意到,如果我在/etc/profile.d/autologut.sh中创建一个文件,文件中只有set autologout=30,那么它会中断传递源于/etc/profile的任何脚本的参数 显示这一点的示例脚本是: #!/bin/bash source /etc/profile echo ${@} 当我运行它时,脚本只看到参数“autologue 30”,并且在运行它时没有得到我试图传递的任何参数 无论自动编译脚本的名称、属性的名称如何,

我正在尝试在Centos虚拟机上配置自动注销。我注意到,如果我在/etc/profile.d/autologut.sh中创建一个文件,文件中只有
set autologout=30
,那么它会中断传递源于/etc/profile的任何脚本的参数

显示这一点的示例脚本是:

#!/bin/bash 
source /etc/profile 
echo ${@}
当我运行它时,脚本只看到参数“autologue 30”,并且在运行它时没有得到我试图传递的任何参数

无论自动编译脚本的名称、属性的名称如何,或者如果我设置了自动编译30,都会发生这种情况


有人能解释一下发生了什么事吗?就好像autologout.sh正在劫持这些参数。我对正在发生的事情感到不知所措,研究profile.d和set命令没有发现任何结果。

set
不用于修改POSIX兼容shell中的shell变量。相反,当给定位置参数时,它会修改命令行参数列表

如果只想给变量赋值,不要使用
set
。相反,您的文件应该只包含:

autologout=30

…和
“$@”
将保持其原始状态。

set
不用于修改与POSIX兼容的shell中的shell变量。相反,当给定位置参数时,它会修改命令行参数列表

如果只想给变量赋值,不要使用
set
。相反,您的文件应该只包含:

autologout=30

…和
“$@”
将保持其原始状态。

顺便说一句,
(($)&&printf“%q\n'”$@“
是在bash中列出命令行参数的更可靠的方法。使用
echo$@
(或其确切但不必要的冗长等价物
echo${}
),您无法区分
yourscript foo bar
yourscript“foo bar”
之间的区别;此外,由于缺少引用,
yourscript'*'
将发出
echo$@
文件列表,而不是
*
字符<代码>回音“$@”/代码>将解决此问题,但将其他问题排除在外。(也就是说,从脚本中获取代码< > /ETC/Prime<代码>通常是不好的形式——使脚本依赖于主机本地配置使其在定义上不可移植)。在这种情况下,它会自动标记@FreakyDan:请查看bash手册页中SHELL BUILTIN COMMANDS部分中的
set
命令:首先,通过
set-o NAME VALUE
设置选项。其次,bash.BTW中没有自动编译选项,
($#)和&printf“%q\n'$@”
是在bash中列出命令行参数的更可靠的方法。使用
echo$@
(或其确切但不必要的冗长等价物
echo${}
),您无法区分
yourscript foo bar
yourscript“foo bar”
之间的区别;此外,由于缺少引用,
yourscript'*'
将发出
echo$@
文件列表,而不是
*
字符<代码>回音“$@”/代码>将解决此问题,但将其他问题排除在外。(也就是说,从脚本中获取代码< > /ETC/Prime<代码>通常是不好的形式——使脚本依赖于主机本地配置使其在定义上不可移植)。在这种情况下,它会自动标记@FreakyDan:请查看bash手册页中SHELL BUILTIN COMMANDS部分中的
set
命令:首先,通过
set-o NAME VALUE
设置选项。其次,bash中没有自动编译选项。