为什么非交互式Bash shell中的别名不起作用

nis*_*sah 44 bash alias non-interactive

我试图在非交互式bash shell中使用别名.我已经定义了我的别名~/.bashrc,我已经设置了变量BASH_ENV=~/startUpFile.startUpFile的内容是source ~/.bashrc.

当我执行alias命令时,我可以看到我的别名被识别.但是,如果我尝试使用定义的别名~/.bashrc,Bash无法识别它.它给了我未知的命令错误.

使用TCSH shell可以很容易地执行此操作,因为~/.cshrc始终会读取文件.

有什么想法我怎么能用Bash shell做到这一点?

Jim*_*wis 46

该命令shopt -s expand_aliases将允许在非交互式shell中进行别名扩展.

  • 也许还提到即使有这个,别名也不会在包含此语句的代码的物理行中可用,因此使用它的单行代码将不起作用.解决方法是在命令`ssh remote $'shopt -s expand_aliases \nll'之间使用换行符而不是分号. (4认同)
  • 在将我的别名定义移到BEFORE我的函数定义之前,它没有处理函数上使用的别名; 读取函数定义时,别名似乎会扩展! (2认同)

Mic*_*lon 15

.bashrc 仅由交互式shell处理.

此外,除非使用expand_aliasesshell设置shell ,否则当shell不是交互式时,别名不会展开shopt.当然,除非通过使用名称sh而不是调用shell来调用POSIX模式bash.

使用别名的人经常.bashrc在他们的个人资料的末尾来源他们,以便即使对于非交互式的shell也会有别名.这可能不是最好的方式,但它很常见.

这样的事情让我相信,在21世纪,我们应该放弃shell脚本,转而使用像Python这样的成熟语言.它更具可预测性.

  • python是一种糟糕的交互式语言.除非空格正是您所需要的,否则您无法剪切/粘贴代码的随机位.tclsh虽然是一个不错的shell - 如果你输入的命令不是已知的tcl命令,它内置了执行shell命令的能力.此外,它的本质使得交互式使用变得可行.然而,就像我对Tcl的粉丝一样,我仍然更喜欢好的互联网使用.很可惜tksh从来没有完全达到逃脱速度. (7认同)
  • 意见提醒!意见提醒!(并不是说Python本身有任何问题 - 保存它是动态类型的Oo - 但Ruby和Perl(谁知道还有什么)也是该市场的好竞争者) (2认同)

Vin*_*vic 9

你必须

shopt -s expand_aliases
Run Code Online (Sandbox Code Playgroud)

在您指向的文件中 BASH_ENV