击。从两个变量中定义别名

时间:2016-12-20 18:20:18

标签: arrays bash eval alias

在提出此问题之前,我已经检查了thisthisthis可能相关的帖子,但我无法找到解决方案。是不同的别名情况。我希望这不是重复。

我有一系列可能的别名:

OutputStream

我想要的是测试command1是否存在且可以启动。如果不可启动,则使用possible_alias_names创建别名。我的意思是,如果我们无法启动command1,我希望能够尝试启动command2。

我使用declare -A possible_alias_names=( ["command1"]="command2" #This is an array because there are more #But for the example is enough with one in the array ) 来测试系统中是否存在命令并且运行良好。我想保持(如果可能的话)仍然使用哈希。

对于该示例,系统中不存在hash,并且command1存在。因此,目标是检查数组中的每个键,以查看是否可以启动该命令(存储在键中)。如果不存在,则创建一个别名以启动数组的相应值。

以这种方式对阵列可能更容易理解:

command2

declare -A possible_alias_names=( ["thisCmdDoentExist"]="ls" ) 命令将存在,所以重点是能够创建这样的语法ls

这样的别名

这是我的完整NOT WORKING代码:

alias thisCmdDoentExist='ls'

似乎问题是扩展,因为在单引号之间它没有取值。我也试过#!/bin/bash declare -A possible_alias_names=( ["y"]="yes" ) for item in "${!possible_alias_names[@]}"; do if ! hash ${item} 2> /dev/null; then if hash ${item} 2> /dev/null; then echo "always enter here because the command ${item} is not available" fi alias "${item}='${possible_alias_names[$item]}'" #I also tried... alias ${item}='${possible_alias_names[$item]}' #I also tried... alias ${item}="${possible_alias_names[$item]}" if hash ${item} 2> /dev/null; then echo "You win!! alias worked. It means ${item} is available" fi fi done 失败了:

eval

我从来没有得到第二个回声看到“你赢了!!”信息。别名不起作用!我怎么办?

1 个答案:

答案 0 :(得分:1)

这是一种更轻松的方式来重现您的问题:

#!/bin/bash
alias foo=echo
foo "Hello World"
hash foo

以下是您运行时会发生什么:

$ bash myscript
myscript: line 3: foo: command not found
myscript: line 4: hash: foo: not found

$ foo "Hello World"
bash: foo: command not found

这里的问题是:

  1. 默认情况下,脚本中未启用别名。
  2. hash无法识别别名。
  3. 取决于您对此脚本的期望:

    1. 即使你启用了别名,它们也会在脚本完成后无法使用。
    2. 要解决这三个问题,您应该source来自交互式shell的脚本,并使用type代替hash

      $ cat myscript
      alias foo=echo
      foo "Hello World"
      type foo
      

      然后source

      $ source myscript
      Hello World
      foo is aliased to `echo'
      
      $ foo "Hello World"
      Hello World
      

      您设置别名的一些尝试现在可以成功运行,但最好的方法是:

      key="foo"
      value="echo"
      alias "$key=$value"