我写了这个东西,但它不起作用。我不知道为什么。该脚本不会创建任何别名。以下是我的剧本:
# !/bin/bash
ans=t
while [ $ans == y ]; do
echo "Give alias name"
read name
echo "Give aliast instruction"
read instruction
echo "alias $name='$instruction'"
read ans
done
这可能是一个简单的问题,我对Linux完全陌生。
2条答案
按热度按时间ldioqlga1#
“==”不表示测试相等。它是一个简单的等号:“=”用于检查是否不同,它是:!=
对于定义别名,您必须使用命令别名。
并且您必须使用以下命令执行该脚本:
第一个点很重要,否则脚本将由子外壳执行,别名定义将为子外壳定义,而不是实际的外壳。
agyaoht72#
在Unix派生系统中,进程(子进程)更改创建它的进程(父进程)的环境是不正常的。这与Windows形成了鲜明的对比,Windows在历史上没有进程的概念。Windows,尤其是它的命令环境,其执行模型归功于20世纪70年代称为CP/M的系统,它就是从这个系统克隆出来的。
在Windows中,
batch
文件可以更改当前外壳的环境;例如,cd /temp
将更改外壳的当前目录。在Unix派生的系统中,情况并非如此。子对象不能更改父对象的环境[当然,下面有一个例外];因此,任何打开、关闭、更改目录、设置/重置环境变量等的文件都不能更改。所有这些都只影响孩子。因此,尽管您可能拥有一个包含
别名BYE=LOGOUT``的脚本,但该别名将只存在于脚本中。 例外的是*采购*的概念。Unix外壳程序通常有一个名为
source(缩写为
.,如
. myscript.sh)的命令,该命令不是创建一个新进程来运行*myscript.sh*,而是仅在当前外壳程序中包括*myscript.sh*。 有了*SOURCE*,你就可以在整理评论中提到的错误后,达到你需要的效果。同时,您应该能够获得类似
别名Bob=“I Need,I Need,I Need”之类的资源