bash中的多行别名


13

我有以下脚本。这是一个简单的测试用例,其中可以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.

我的目的是使它成为别名,以便我可以获取此脚本并仅运行别名以执行命令行。有人可以看一下,让我知道错误是什么吗?


3
当您认为需要多行和多命令别名时,该定义一个函数或编写一个脚本了。
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy指出
Jovin Miranda

Answers:


15

你这里有几个问题

  1. 与in csh,in 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函数而不是此类别名


1
使用周围的别名单引号另一个原因是,双引号中的变量被扩展,所以$a$b会在定义时被扩展,而不是在执行的别名。
Barmar

感谢您的解决方案,这里的问题是尽管我按照您的要求编写了脚本,当我执行脚本时我得到了jo:命令,由于某种原因找不到别名,没有被注册。当我获取文件时,我得到此错误Unmatched“。我正在做别名而不是函数的唯一原因是我想在命令行中调用此代码行,而在函数中我不知道该如何实现。函数调用通常在脚本内使用别名只是为了确保我可以像使用函数一样使用它,并在需要时调用它
Jovin Miranda

无论如何修复它,我使用默认的外壳作为tcsh,因此问题来了。
Jovin Miranda

8

习惯于使用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"
}

感谢您的解决方案,当我在脚本中调用函数时,此方法确实起作用。我如何从命令行本身调用函数,导致我有多个此类脚本,并且更希望出现一种情况,即我将所有函数写在一个文件中,而是从命令行调用它们。那就是我取别名的全部原因
Jovin Miranda

完全一样 将函数放在文件中并提供该文件的源文件
glenn jackman

知道了,我实际上所做的是使用跟踪功能。命令“ $ @”,以便我可以在执行文件时调用函数名
Jovin Miranda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.