Bash 中的多行别名

Bash 中的多行别名

我有以下脚本。这是一个简单的测试用例,其中a是任何字符串值,并且b应该是一条路径。

#!/bin/bash

alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""

但是,每当我尝试执行 ./sample.sh 时都会出现以下错误:

./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found

当我尝试时,source sample.sh我得到了以下信息:

a: Undefined variable.

我的目的是将其设为别名,以便我可以获取此脚本并运行别名来执行命令行。有人可以看看这个并告诉我错误是什么吗?

答案1

这里有几个问题

  1. 与 不同csh,在 中bash(以及其他类似 Bourne 的 shell),别名是用符号指定的,=例如alias foo=bar

  2. 引号不能像这样嵌套;在这种情况下,你可以在别名两边使用单引号,在别名内部使用双引号

  3. 反斜杠\行延续字符:从句法上讲,它使你的命令变成单身的线(与你想要的相反)

所以

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

测试:首先我们获取文件:

$ . ./myscript.sh

然后

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

如果你想使用别名之内脚本,请记住别名仅在交互式 shell 中默认启用:要在脚本中启用它们,您需要添加

shopt -s expand_aliases

无论上述内容如何,​​您都应该考虑使用 shell 函数,而不是像这样的别名

答案2

习惯于在 POSIX 类型的 shell 中使用函数。您不会遇到任何引用问题:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}

答案3

只需创建一个 shell 函数并使用它:

showfiles() {
defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder }

完毕....

相关内容