在另一个脚本中使用别名 (ksh)

在另一个脚本中使用别名 (ksh)

我正在编写一个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 时才会读取您的别名。

相关内容