Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash中定义类似宏的函数_Linux_Bash_Ubuntu_Macros - Fatal编程技术网

Linux 在bash中定义类似宏的函数

Linux 在bash中定义类似宏的函数,linux,bash,ubuntu,macros,Linux,Bash,Ubuntu,Macros,是否可以在bash中定义宏函数,以便在编写以下代码时: F(sth); bash运行以下命令: echo "sth" > a.txt; 调用时不使用括号。这就是你所说的: F "text to save" 是的,只有你可以用F sth来称呼它: F() { echo "$1" > a.txt } 阅读更多。任意语法不能用来做任何事情。圆括号是元字符,对解析器具有特殊意义,因此无法将其用作有效名称。扩展shell的最佳方法是定义函数 这将是一个基本的echo包装器,它总是写

是否可以在bash中定义宏函数,以便在编写以下代码时:

F(sth);
bash运行以下命令:

echo "sth" > a.txt;
调用时不使用括号。这就是你所说的:

F "text to save"

是的,只有你可以用
F sth
来称呼它:

F()
{
  echo "$1" > a.txt
}

阅读更多。

任意语法不能用来做任何事情。圆括号是元字符,对解析器具有特殊意义,因此无法将其用作有效名称。扩展shell的最佳方法是定义函数

这将是一个基本的
echo
包装器,它总是写入同一个文件:

f() {
    echo "$@"
} >a.txt
这与stdin的作用大致相同,但额外处理stdin-牺牲echo的
-e
-n
选项:

f() {
    [[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}"
} >a.txt


f这是很久以前的回答,但为了提供满足原始请求的回答(尽管这可能不是实际需要的):
这是基于西蒙·塔瑟姆的作品

F() { str="$(history 1)"; str=${str# *F(}; echo "${str%)*}"; } >a.txt
alias F='\F #'

$ F(sth)
$ cat a.txt
sth

另请参见Ormaj的。

+1,回答不错。您是否介意更详细地解释一下为什么使用更复杂(但更好)的结构来输出参数?它只允许从stdin或arguments输入。测试表达式可以防止同时存在零arg和stdin来自终端的情况,在这种情况下,外壳必须被终止,因为进程自己的tty正在被读取和阻塞。如果通过,则位置参数将在设置时展开,或者从函数的输入读取展开。使用
cat
,可能会有一个稍微更便携但速度较慢的解决方案-这需要一个带有real/dev/fd/*的系统。我刚刚发布了这个技巧,因为我之前的答案与其他答案相同。:)而且,它确实允许多个参数,就像
echo
一样。您的函数使用的是
f一二三
,而其他函数只使用
f“一二三”
。如果输入没有qotes,其他解决方案只会考虑第一个词(这里是“一”)。如果你能在答案中包含这些解释,那就太好了,这样其他人可以从中学习。添加了一些解释。处理与echo相同的功能可能会变得更加复杂,但这似乎有点超出了这个问题的范围,需要一些选项parsingSorry必须将其插入
history
几乎和别名一样蹩脚:)通过利用递归别名扩展,不使用
BASH_别名的更复杂的半便携版本是可能的。但是只有一个程序员会编写这种代码。
f arg1 arg2...
f <file
F() { str="$(history 1)"; str=${str# *F(}; echo "${str%)*}"; } >a.txt
alias F='\F #'

$ F(sth)
$ cat a.txt
sth