首页 > 解决方案 > 创建自定义 `ls` 但仅供手动使用

问题描述

我正在考虑编写自己的ls命令。主要是作为一种学习体验,但我也认为我可以让它比默认设置更有用(对我来说)。

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

有没有办法覆盖ls,但只有在脚本(或管道)中不使用它时?

标签: bashshellshzshls

解决方案


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

让我们看一下 POSIX 标准。

手册页alias

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

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

手册页bash

当 shell不是交互式时,别名不会扩展,除非使用 shopt 设置了 expand_aliases shell 选项(请参阅下面的 SHELL BUILTIN COMMANDS 下的 shopt 描述)。

这意味着,您不必担心shell 脚本- 它们将使用ls.

但是管道呢?同样,我们可以将这两个手册页结合起来非常好:

从手册页bash

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

从手册页alias

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

也就是说,虽然您的别名不会在 shell 脚本中使用,但它将在管道中使用。


推荐阅读