我正在编写一个ksh
脚本,我想在我的.profile
文件和脚本中使用由别名定义的命令。我在包含脚本的文件夹中尝试了此命令,它有效。但是,在我的脚本中,我[command] not found
:
我该如何解决这个问题?我的命令只是创建ls
一个存储库,然后我在脚本中执行以下操作:
[command]| grep ... | { IFS== read -r var1 x && IFS== read -r var2 x; }
答案1
不要在脚本中使用别名。正是由于这个原因,这是一个坏主意。有多种方法可以解决此问题:
- 在脚本本身中定义别名
从脚本中获取包含别名的文件。添加这一行:
. /home/your_user/.profile
使用命令本身而不是别名。例如,如果您有
alias foo="echo bar"
,请echo bar
在脚本中使用 ,而不是foo
.
作为一般规则,在 中设置别名是一个坏主意.profile
。该文件只能由登录 shell 读取,不能由交互式 shell 读取,也不能在运行脚本时读取。为了使您的别名易于访问,您应该将它们添加到$HOME/.kshrc
.以下内容来自man ksh
:
如果 exec(2) 调用 shell,并且参数零 ($0) 的第一个字符是 -,则假定该 shell 是登录 shell,并且从 /etc/profile 读取命令,然后从 .profile 中的任一文件读取命令。当前目录或 $HOME/.profile(如果任一文件存在)。接下来,对于交互式 shell,如果文件存在,则通过对环境变量 ENV 的值执行参数扩展、命令替换和算术替换来从指定的文件中读取命令。
换句话说,登录 shell 读取变量中的任何内容/etc/profile
,而.profile
交互式 shell(打开终端时得到的内容)读取$ENV
变量中的任何内容,或者如果未定义变量,则读取~/.kshrc
.这意味着.profile
只有在 sshing 进入计算机或以其他方式启动登录 shell 时才会读取您的别名。