Linux 为什么在脚本中使用“引用”;设置变量=值;打破$@?
我正在尝试在Centos虚拟机上配置自动注销。我注意到,如果我在/etc/profile.d/autologut.sh中创建一个文件,文件中只有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”,并且在运行它时没有得到我试图传递的任何参数 无论自动编译脚本的名称、属性的名称如何,
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中没有自动编译选项。