Warm tip: This article is reproduced from serverfault.com, please click

bash-创建一个自定义的“ ls”,但仅用于手动使用

(bash - Create a custom `ls` but only for manual use)

发布于 2020-12-04 03:01:31

我正在考虑编写自己的ls命令。主要是作为一种学习经验,但我也认为我可以使它比默认值有用。

我担心如果我使用alias ls,这也会干扰使用ls作为输出的任何bash / sh脚本。

ls只有在脚本(或管道)中未使用它时,才可以覆盖它吗?

Questioner
Evert
Viewed
11
Thomas 2020-12-04 18:54:12

你担心别名的版本ls会干扰其他进程。

让我们看一下POSIX标准。

在以下页面alias手册页中

KornShell的历史版本允许将别名导出到由同一Shell调用的脚本。这是由别名-x标志触发的;仅当使用显式扩展名-x时,此POSIX.1-2008卷才允许使用此扩展名。标准开发人员认为别名主要用于交互式用户,并且别名通常不应影响这些用户调用的shell脚本函数可用于此类脚本。

那么,“通常”对bash意味着什么?例如,ls在shell脚本中将使用哪个版本的

在以下页面bash手册页中

如果外壳程序不是交互式的则别名不会扩展,除非使用shopt设置expand_aliases shell选项(请参阅下面的SHELL BUILTIN COMMANDS下的shopt的说明)。

这意味着,你不必担心shell脚本-它们将使用的未别名版本ls

但是管道呢?同样,我们可以将这两个手册页很好地结合在一起:

在以下页面的手册页中bash

管道中的每个命令都作为单独的进程(即,在子Shell中)执行。

在以下页面的手册页中alias

别名定义将影响当前外壳程序执行环境和当前外壳程序子外壳程序的执行环境。当按POSIX.1-2008卷的规定使用时,别名定义不应影响当前shell的父进程,也不影响该shell调用的任何实用程序环境。

也就是说,虽然你的别名不会在外壳脚本中使用,但会在管道中使用。