你们中有人知道每当调用新的 shell 时(从任何地方)扩展别名的方法吗?
例如我的别名是:
alias ls='ls -F'
现在如果我调用它
grep -l ramesh | xargs ls
…这里我应该得到
ls -F
输出。如果我这样做
cut -f 1 `ls test*`
我应该找个
ls -F
替代品。
在 shell 脚本中,有这个选项shopt -s expand_aliases
,但如何才能将它放到所有地方呢?
答案1
由于ls
在第一个示例中您的 shell 实际上并未调用 ,因此该别名不适用于xargs
。
别名不会导出到子 shell,这就是第二个示例失败的原因。
由于别名是在读取一行之后进行评估的,因此您foo=$( alias ls='ls -l' ; ls )
也不能这样做。
为了获得所需的效果bash
,您可以使用函数,例如
function ls { /bin/ls -F "$@" ; }
您可以将这些添加到子 shell 中,如下所示,以使其正常工作:
ret=$( function ls { /bin/ls -l "$@" ; } ; ls )
使其在任何程序执行的所有地方工作的正确解决方案是在搜索中实际调用带有参数的实际之前ls
放置一个命名的脚本。ls
ls
$PATH
ls
-F
#!/bin/bash
/bin/ls -F "$@"
另存为/usr/local/bin/ls
和export $PATH=/usr/local/bin:$PATH
。
请注意使用/bin/ls
硬编码的程序和解析输出的程序,ls
当其格式与预期不同时将会失败。