我有一个很长的命令,我只想用它alias
来缩短它。但该命令包含单引号和感叹号。
原点命令是ldapsearch -x -H ... -w 'abc!123'
.
我尝试过alias search='ldapsearch -x -H ... -w \'abc!123\''
或者alias search="ldapsearch -x -H ... -w 'abc!123'"
等等。但它们都不适合我。
我有一个很长的命令,我只想用它alias
来缩短它。但该命令包含单引号和感叹号。
原点命令是ldapsearch -x -H ... -w 'abc!123'
.
我尝试过alias search='ldapsearch -x -H ... -w \'abc!123\''
或者alias search="ldapsearch -x -H ... -w 'abc!123'"
等等。但它们都不适合我。
!
只是历史扩展的问题。历史扩展仅发生在交互式 shell 中(当没有像我一样被用户完全禁用时)和 bash 中(如 zsh,但与历史扩展和别名都来自的 csh 相反)发生在别名扩展之前,并且在别名扩展之后不会再次执行别名是扩展的,因此可以!
在别名的值中保留不带引号的值:即使在交互式 shell 中运行该
alias
命令也没有问题,因为在 bash 中(再次类似于 zsh,但与 csh 相反),单引号会阻止!
,^
... 触发历史扩展。要
!
在别名的值中使用单引号,您必须执行以下操作:也就是说,请确保使用
!
,'...'
或$'...'
(\
任何其他形式的引号之外)而不是双引号引用。"abc!123"
在非交互式 shell 中使用可以工作,但在交互式 shell 中则不行。"abc\!123"
可以在交互式环境中工作,但不能在非交互式环境中工作。您可以使用函数来代替别名(
alias
es 很受欢迎,因为它们出现在 csh 中(大约 1979 年),早于 Bourne shell 添加函数(大约 1983 年),但如今它们在 shell 面前确实是一个疣)。或者甚至可能更好,将其设为:
然后您就可以从任何地方调用它,而不仅仅是交互式 shell。
现在在命令行上传递密码是非常糟糕的做法,因为命令行参数是大多数系统上的公共信息。它们显示在 的输出中
ps -f
,存储在 shell 历史记录或审核日志中。相反,你应该使用类似的东西:
仅
~/.config/secrets/ldap/host.password
您自己可读并包含密码,或者:将密码存储在别名中可能会带来安全隐患。我建议您使用一个函数并按如下方式参数化密码。例如
然后你将获取 bashrc 文件
然后使用该函数如下:
提示:您还可以使用
read -s -p 'Enter password: ' password
密码,这样密码就不会出现在您的历史文件中。