如何编写一个函数zsh来调用与函数本身同名的现有命令?例如,我试过这个来说明我的问题:
function ls
{
ls -l $1 $2 $3
}
Run Code Online (Sandbox Code Playgroud)
当我执行它时,ls *我得到以下信息:
ls:1: maximum nested function level reached
Run Code Online (Sandbox Code Playgroud)
我认为这是因为该函数被递归调用。我怎样才能避免这种情况?
这是一个粗略的示例,在这种情况下,别名可以完成这项工作,但我有一个更复杂的示例,其中别名不合适,因此我需要编写一个函数。
我有多个 bash 函数和别名。我无法记住所有这些,所以我通常最终打开我的.bash_functions和.bash_aliases文件来找到我需要的东西。
如何从 bash 提示符列出可用的函数/别名?
我是否可以使用注释(有点像 PHPDoc)来记录我的 bash 函数/别名?
我只是想要一种简单/不错的方式来输出可用的内容而无需打开文件。运行一个命令并让它吐出我的函数/别名的动态列表会很酷(使用示例将是一个加号)。:)
我f根据此处的示例(在“带参数的选项”下)在 Bash 中定义了该函数:
f () {
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
return 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
return 1
;;
esac
done
}
Run Code Online (Sandbox Code Playgroud)
虽然他们使用脚本,但我直接在 shell 中定义函数。
当我第一次启动 Bash 并定义函数时,一切正常:f -a 123prints -a was triggered, Parameter: 123。但是当我第二次运行完全相同的行时,没有打印任何内容。
是什么导致了这种行为?它发生在 Bash 3.2 和 4.3 中,但它在 Zsh 5.1 中工作正常。这令人惊讶,因为该示例应该用于 Bash,而不是用于 Zsh。
坚持使用 GNU awk 3.1.6 并认为我已经解决了它的数组错误,但在 600 行 awk 程序中仍然存在范围问题。需要验证对 awk 中数组范围的理解才能找到我的错误。
鉴于这个说明性的 awk 代码......
function foo(ga) {
ga[1] = "global result"
}
garray[1] = "global"
foo(garray)
print garray[1]
Run Code Online (Sandbox Code Playgroud)
将打印...
global result
Run Code Online (Sandbox Code Playgroud)
由于数组总是通过引用传递给函数,因此所有数组总是全局的。无法创建本地数组。这样对吗?一直无法找到明确说明这一点的文档。
由于我正在调试,并且 3.1.6 本身在这方面有已知的错误,我试图确定 awk 的错误从哪里停止,我的错误从哪里开始。
补充:为什么 ga[] 在函数内部工作呢?
首先,将数组传递给函数 withfoo(ga)实际上是不必要的。只需garray[]在函数内部访问它。然而,这样做并没有可衡量的性能损失,它有助于调试和错误报告。
在使用中foo(ga),ga[]是全局数组的同义词garray[]。它不是 的本地副本garray[],而是简单的指向 的指针garray[],就像符号链接是指向文件的指针一样,因此可以使用多个名称访问同一个文件(或数组)。
补充:澄清格伦杰克曼的回答
虽然在函数外部创建的数组对函数来说是全局的,并且可以传递给它或只是在函数内部被引用,但在函数内部创建的数组确实对函数保持局部并且在函数外部不可见。修改杰克曼先生的例子说明了这一点......
awk '
function bar(x,y) {
split("hello world", y)
print "x[1] inside: …Run Code Online (Sandbox Code Playgroud) 我有以下功能:
bar() { echo $1:$2; }
Run Code Online (Sandbox Code Playgroud)
我正在从另一个函数调用这个函数,foo. foo本身被称为如下:
foo "This is" a test
Run Code Online (Sandbox Code Playgroud)
我想获得以下输出:
This is:a
Run Code Online (Sandbox Code Playgroud)
也就是说,bar接收到的参数应该与我传入的标记相同foo。
foo需要如何实施才能实现这一目标?我尝试了以下两种实现,但都不起作用:
foo() { bar $*; }
- 输出: this:is
foo() { bar "$*"; }
- 输出: this is a test:
我的问题是如何有效地保留参数的引用。这可能吗?
例如,假设我有一个命令git branch(总是有几个词)。
我想要的是跟踪何时使用参数执行此命令。例如,如果我git branch develop没有错误地执行命令,我想保存develop在一个文件中。
我试图覆盖我的 git 命令.bash_profile,如下所示:
git () {
if [ $# -eq 3 ]
then
git $@
echo $2 > /path/tacked_parameters.txt
else
git $@
fi
}
Run Code Online (Sandbox Code Playgroud)
但似乎效果不佳。有没有办法做到这一点?
我经常生成和注册许多 bash 函数,这些函数可以自动执行我在开发项目中经常执行的许多任务。那一代取决于我正在从事的项目的元数据。
我想用它们生成的项目的信息来注释函数,这样:
func1() {
# This function was generated for project: PROJECT1
echo "do my automation"
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,当我检查定义时,我将能够看到评论:
$ type func1
func1 is a function
func1 ()
{
# This function was generated for project: PROJECT1
echo "do my automation"
}
Run Code Online (Sandbox Code Playgroud)
但不知何故bash似乎在加载函数时忽略了注释,而不是在执行它时。所以评论丢失了,我得到了这个结果:
func1 is a function
func1 ()
{
echo "do my automation"
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将元数据分配给函数,然后再检查它们?使用类型检查定义时可以检索它吗?
function我的.bashrc文件中有一个。我知道它是做什么的,它增加了 X 个目录cd
这里是:
up()
{
local d=""
limit=$1
for ((i=1 ; i <= limit ; i++))
do
d=$d/..
done
d=$(echo $d | sed 's/^\///')
if [ -z "$d" ]; then
d=..
fi
cd $d
}
Run Code Online (Sandbox Code Playgroud)
但是你能帮我解释一下这三件事吗?
d=$d/..sed 's/^\///'d=..为什么不这样做:
up()
{
limit=$1
for ((i=1 ; i <= limit ; i++))
do
cd ..
done
}
Run Code Online (Sandbox Code Playgroud)
用法:
<<<>>>~$ up 3
<<<>>>/$
Run Code Online (Sandbox Code Playgroud) 我已经在 bash/ksh 中声明了函数和变量,我需要将它们转发到sudo su - {user} << EOF:
#!/bin/bash
log_f() {
echo "LOG line: $@"
}
extVAR="yourName"
sudo su - <user> << EOF
intVAR=$(date)
log_f ${intVAR} ${extVAR}
EOF
Run Code Online (Sandbox Code Playgroud) 在 bash 中,我可以写:
caller 0
Run Code Online (Sandbox Code Playgroud)
并接收调用者上下文的:
这对于调试非常有用。鉴于:
yelp () { caller 0; }
Run Code Online (Sandbox Code Playgroud)
然后我可以写yelp来看看到达了哪些代码行。
我可以实现caller 0在bash如下:
echo "${BASH_LINENO[0]} ${FUNCNAME[1]} ${BASH_SOURCE[1]"
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得相同的输出caller 0中zsh?