26

我在示例 shell 脚本中定义的别名不起作用。我是 Linux Shell 脚本的新手。下面是示例 shell 文件

#!/bin/sh

echo "Setting Sample aliases ..."
alias xyz="cd /home/usr/src/xyz"
echo "Setting done ..."

在执行此脚本时,我可以看到回显消息。但是如果我执行 alias 命令,我会看到以下错误

xyz: command not found

我错过了什么吗?

4

7 回答 7

46

你的脚本,不要执行它像./foo.shsh foo.sh

如果你这样执行你的脚本,它在子 shell 中运行,而不是你当前的。

source foo.sh  

会为你工作。

于 2013-04-12T09:51:37.947 回答
25

您需要设置一个特定选项来执行此操作,expand_aliases

 shopt -s expand_aliases

示例:

# With option
$ cat a
#!/bin/bash
shopt -s expand_aliases
alias a="echo b"
type a
a
$ ./a
a is aliased to 'echo b'
b

# Without option
$ cat a
#!/bin/bash
alias a="echo b"
type a
a

$ ./a
./a: line 3: type: a: not found
./a: line 4: a: command not found

参见:https ://unix.stackexchange.com/a/1498/27031和https://askubuntu.com/a/98786/127746

于 2015-06-19T18:07:03.537 回答
3

采购脚本 source script.sh

./script.sh将在子 shell 中执行,所做的更改仅适用于子 shell。一旦命令终止,子外壳程序就会执行,更改也会执行。


或者

HACK:只需在 shell 上运行以下命令,然后执行脚本。

alias xyz="cd /home/usr/src/xyz"
./script.sh

要取消别名,请在 shell 提示符下使用以下命令

unalias xyz 
于 2013-04-12T09:51:10.050 回答
1

如果您在脚本中执行它,则别名将在脚本完成执行时结束。

如果您希望它是永久性的:

您的别名定义明确,但您必须将其存储在 中~/.bashrc,而不是 shell 脚本中。

将其添加到该文件中,然后使用. .bashrc- 它将加载该文件,以便可以使用别名。

如果您希望它仅在当前会话中使用:

只需将其写入控制台提示符即可。

$ aa
The program 'aa' is currently not installed. ...
$ 
$ alias aa="echo hello"
$ 
$ aa
hello
$ 

另外:从肯特的回答中,我们可以看到您也source可以通过source your_file. 在这种情况下,您不需要使用 a shell script,只需一个普通文件即可。

于 2013-04-12T09:46:26.890 回答
0

如果您在提示符下调用它,您的别名必须在您的 .profile 文件中,而不是在您的脚本中。

如果您在脚本中放置别名,则必须在脚本中调用它。

尝试运行内部具有别名的脚本时,源文件是正确的答案。

source yourscript.sh
于 2016-04-14T16:42:37.987 回答
0

将您的别名放在文件调用中 ~/.bash_aliases 然后,在许多发行版中,它将自动加载,无需手动运行 source 命令来加载它。

于 2019-05-19T22:49:39.060 回答
0

您可以使用以下命令。

shopt -s expand_aliases

source ~/.bashrc

eval $command
于 2019-07-22T05:16:18.383 回答