AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 788353
Accepted
jsx97
jsx97
Asked: 2024-12-19 02:18:51 +0800 CST2024-12-19 02:18:51 +0800 CST 2024-12-19 02:18:51 +0800 CST

继承路径修改与继承别名

  • 772

我的登录 shell 是 zsh。我在文件中添加了以下两行.zprofile:

path+=$HOME/foobar123
alias foo='echo bar'

bash然后,如果我通过键入或fish并按回车键切换到 bash 或 fish ,echo $PATH将继续显示该foobar123部分,但foo别名不起作用。

这是为什么?为什么别名和路径修改的处理方式不同?

zsh
  • 1 1 个回答
  • 37 Views

1 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2024-12-19T04:20:12+08:002024-12-19T04:20:12+08:00

    path是与 shell 变量绑定的 shell 数组变量,PATH而 shell 变量本身又与环境变量绑定PATH。

    当执行命令时,进程的所有内存都会被清除。

    环境变量是一种在执行过程中传递数据的方法。与命令参数一样,它们是以 NUL 分隔的字符串列表,但与参数相反,按照惯例:

    • 它们的形式是VAR=values
    • 命令(无论是 shell 还是其他任何东西)都会记住它们在执行时收到的环境变量列表,并将它们传递给它们执行的命令(如果它们或它们的子命令执行的话),从而实现一种继承和可继承的环境形式。有一个标准 C API(putenv()、setenv()、unsetenv()、environ变量)来维护记住的环境变量列表(环境),并执行命令,传递该列表(execl()、execvp()... 它们是execve()系统调用的包装器)。

    具体来说,Shell 除了这样做之外,还会用其语言为它们收到的一些环境变量创建一个变量,并且其名称与 shell 变量的名称兼容。类似 Bourne 的 Shell 可以使用export内置命令将 shell 变量提升为环境变量(其他 shell 有等效变量)。

    csh、tcsh、zsh、yash、fish shell 有方法将$PATH或其他具有:-分隔值的变量(通常是环境变量,例如PATH)绑定到数组变量。

    为了进行比较,perl(也是一种编程语言解释器,但不是 shell 解释器)将环境变量映射到它的%ENV关联数组(例如,PATH环境变量在中可用$ENV{PATH}),awk与 相同ENVIRON["PATH"],对于环境变量vim有,$var而它只是var用于它自己的变量或@x寄存器等。

    总而言之,环境变量PATH是通用的,可以被所有事物理解,并且可以(按照惯例)在执行过程中继承。

    没有与 shell 别名等效的功能,这是最初来自 csh 的一些(并非全部)shell 的(糟糕)特性,其语法因 shell 而异,任何语言的其他数据结构也各不相同。

    某些 shell(例如rc和 派生函数 或 )bash可以导出自己的函数(以及rc和 派生函数中的数组),为此,它们会劫持环境变量,其中函数定义以特定格式存储,但只有同一 shell 的其他实例才能从环境中加载这些变量并重新创建它们编码的函数(或数组)。这些变量对于语法不同的其他 shell(或perl、vim、 ...)毫无意义。awk

    为了能够将您的 zsh 别名列表传递给以便bash创建等效的 bash 别名,您需要使用该语言创建代码bash,一旦评估该代码就会重新创建这些别名。bash并且zsh有一些共同的语法,特别是基本alias内置语法是从 Korn shell 而不是 csh 复制而来的,但是 zsh 添加了更多功能,例如全局别名或后缀别名,并且在别名方面没有与 bash 相同的限制,并且 bash 的名称和值中都不能包含 NUL,因此并非所有 zsh 别名都可以转换为 bash 别名。

    尽管这两个 shell 以相同的方式理解单引号(只要rcquotes在 中未启用zsh),但它们的引用语法也不同。zsh 在特殊关联数组中提供其普通别名列表$aliases,并且 likebash可以使用 转储别名定义列表alias -L。

    但在后者中,它并不总是使用单引号,并且可能会转储名称或值在 bash 中不起作用的别名,因此您最好循环$aliases,过滤掉那些不能工作的别名bash,然后手动进行引用(就像使用qq参数扩展标志一样)。

    • 3

相关问题

  • 列出没有其他后缀文件的文件

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 符号链接所有点文件和目录

  • 如何在`zsh`中增加一个动态命名的变量

  • 为什么我不能在 zsh 中定义一个名为 path 的只读变量?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve