在提出此问题之前,我已经检查了this,this和this可能相关的帖子,但我无法找到解决方案。是不同的别名情况。我希望这不是重复。
我有一系列可能的别名:
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
我从来没有得到第二个回声看到“你赢了!!”信息。别名不起作用!我怎么办?
答案 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
这里的问题是:
hash
无法识别别名。取决于您对此脚本的期望:
要解决这三个问题,您应该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"