bash - 创建自定义 `ls` 但仅供手动使用
问题描述
我正在考虑编写自己的ls
命令。主要是作为一种学习体验,但我也认为我可以让它比默认设置更有用(对我来说)。
我担心如果我使用 alias ls
,这也会干扰任何使用 ls 作为输出的 bash/sh 脚本。
有没有办法覆盖ls
,但只有在脚本(或管道)中不使用它时?
解决方案
你担心你的版本的别名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 脚本中使用,但它将在管道中使用。
推荐阅读
- go - Golang Api Kind Struct Creation 上的类型冲突
- java - 单个 netty 服务器中的多个 Socket 服务器
- python - 将输入发送到后台运行的 Bluestacks 应用程序
- javascript - Highcharts 共享时限制工具提示悬停:true
- javascript - 无法在 Windows 加载时调用 onchange 函数
- pandas - 用于输入 Pandas 的 csv 文件的预期结构是什么
- coq - Coq 中的逻辑是如何编码的?
- python - 如何为绘图甘特图中的元素指定颜色?
- python - 清除pyspark中指定表的缓存
- python - 如何在并行映射中传递“常量”参数?