Why aliases in a non-interactive Bash shell do not work
我尝试在非交互式bash shell中使用别名。我在~/.bashrc中定义了别名,并设置了变量BASH_ENV=~/startUpFile。启动文件的内容是source ~/.bashrc。
当我执行alias命令时,我可以看到我的别名被识别。但是,如果我尝试使用~/.bashrc中定义的别名,bash就无法识别它。它给了我一个未知的命令错误。
使用tcsh shell很容易做到这一点,因为总是读取~/.cshrc文件。
我能用巴什壳做这个吗?
- 这个答案对interactive和non-interactiveshell配置有很好的解释。另外,当您处于non-interactive模式时,还有一个关于包括.bashrc的提示。
命令shopt -s expand_aliases允许在非交互shell中扩展别名。
- 谢谢迈克尔和吉姆,它现在起作用了。
- 在我将别名定义移到函数定义之前,它不会处理用于函数的别名;当读取函数定义时,别名似乎被扩展了!
- 也许还提到,即使这样,别名在包含此语句的物理代码行中仍然不可用,因此使用它的单行程序将不起作用。解决方法是在命令ssh remote $'shopt -s expand_aliases
ll'之间使用换行符而不是分号。
- 另一种选择是运行bash -i,强制shell进行交互(从副本中——见右侧的"链接问题")。
.bashrc仅由交互shell处理。
此外,除非使用shopt设置expand_aliasesshell选项,否则当shell不交互时,别名不会展开。当然,除非通过调用名为sh而不是bash的shell来调用posix模式。
经常使用别名的人通常会在配置文件的末尾找到他们的.bashrc,这样即使对于非交互shell,别名也会存在。这可能不是最好的方法,但很常见。
正是这样的事情让我相信,在21世纪,我们应该放弃shell脚本,转而使用像python这样成熟的语言。更容易预测。
- Python是一种糟糕的交互式语言。除非空格正是您所需要的,否则您不能剪切/粘贴随机的代码位。不过,tclsh提供了一个非常好的shell——如果您输入的命令不是已知的tcl命令,它内置了执行shell命令的能力。另外,它的本质使交互式使用成为可能。然而,尽管我是TCL的粉丝,但我还是更喜欢将好的ol'bash用于交互式使用。遗憾的是tksh没有达到逃逸速度。
- /etc/profile技巧只对提供--login选项的非交互式shell有效。
- 你说得对,Python是一种糟糕的交互语言。你应该使用bash。但是如果你必须写一个脚本,那就用Python来完成。因为它是一种面向对象的语言,所以可以通过将代码位编写为类、方法和函数来重用它们。脚本和编程是一样的,所以使用像python这样强大的编程语言。但是对于交互,对于两个或三个命令管道,bash是可以的。
- 意见提醒!意见提醒!(并不是说python本身就有什么问题——除了它是动态类型的O.O之外——而是ruby和perl(以及谁知道还有其他的东西)也是该市场的有力竞争者)
- 您可以在bash中编写"可重用"函数…# ThatsHot (){ echo"Thanks, gorgeous."; }; ThatsHot
你必须
在你的EDOCX1中指向的文件中
- 是的,可以做到,但对我来说仍然不管用。
- 你需要扩展别名
- 谢谢,现在可以用了
我也有类似的问题,最后,我发现~/.bashrc是我所需要的。
但是,在Ubuntu中,我不得不对停止处理的行进行注释~/。bashrc:
1 2
| If not running interactively, don't do anything
[ -z"$PS1" ] && return |
- 但是这样做有多安全?为什么放在那里?我马上就要做了……