我在样本shell脚本中定义的别名不起作用。我是Linux Shell Scripting的新手。 下面是示例shell文件
#!/bin/sh
echo "Setting Sample aliases ..."
alias xyz="cd /home/usr/src/xyz"
echo "Setting done ..."
执行此脚本时,我可以看到回显消息。但是如果我执行alias命令,我会看到以下错误
xyz: command not found
我错过了什么吗?
答案 0 :(得分:37)
来源您的脚本,请勿执行./foo.sh
或sh foo.sh
如果您执行这样的脚本,它将在子shell中运行,而不是您当前的。
source foo.sh
适合你。
答案 1 :(得分:17)
您需要设置一个特定选项,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
cf:https://unix.stackexchange.com/a/1498/27031和https://askubuntu.com/a/98786/127746
答案 2 :(得分:3)
采购脚本 source script.sh
./script.sh
将在子shell中执行,所做的更改仅适用于子shell。一旦命令终止,子shell就会进行更改。
HACK:只需在shell上运行以下命令,然后执行脚本。
alias xyz="cd /home/usr/src/xyz"
./script.sh
to unalias在shell提示符下使用以下
unalias xyz
答案 3 :(得分:1)
如果在脚本中执行它,则在脚本完成执行时别名将结束。
如果您希望它是永久性的:
您的别名已明确定义,但您必须将其存储在~/.bashrc
中,而不是存储在shell脚本中。
将其添加到该文件,然后使用. .bashrc
来源 - 它将加载文件,以便可以使用别名。
如果您希望仅在当前会话中使用它:
只需在控制台提示符下写一下。
$ aa
The program 'aa' is currently not installed. ...
$
$ alias aa="echo hello"
$
$ aa
hello
$
另外:从Kent answer我们可以看到source
source your_file
shell script
。在这种情况下,您不需要使用{{1}},只需要普通文件即可。
答案 4 :(得分:0)
如果您在提示符下调用别名,则别名必须位于.profile文件中,而不是在脚本中。
如果在脚本中添加了别名,则必须在脚本中调用它。
在尝试运行内部具有别名的脚本时,源文件是正确的答案。
source yourscript.sh
答案 5 :(得分:0)
将别名放入文件调用〜/ .bash_aliases中,然后在许多发行版中,它将自动加载,而无需手动运行source命令来加载它。
答案 6 :(得分:0)
您可以使用以下命令。
shopt -s expand_aliases
source ~/.bashrc
eval $command