标签: function

如何在 zsh 中创建一个调用同名现有命令的函数?

如何编写一个函数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)

我认为这是因为该函数被递归调用。我怎样才能避免这种情况?

这是一个粗略的示例,在这种情况下,别名可以完成这项工作,但我有一个更复杂的示例,其中别名不合适,因此我需要编写一个函数。

zsh function

11
推荐指数
1
解决办法
4142
查看次数

如何记录我的自定义 bash 函数和别名?

问题:

我有多个 bash 函数和别名。我无法记住所有这些,所以我通常最终打开我的.bash_functions.bash_aliases文件来找到我需要的东西。

问题):

如何从 bash 提示符列出可用的函数/别名?

我是否可以使用注释(有点像 PHPDoc)来记录我的 bash 函数/别名?

我只是想要一种简单/不错的方式来输出可用的内容而无需打开文件。运行一个命令并让它吐出我的函数/别名的动态列表会很酷(使用示例将是一个加号)。:)

bash documentation alias function

11
推荐指数
2
解决办法
4867
查看次数

带有 `getopts` 的 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。

bash function getopts

11
推荐指数
2
解决办法
9778
查看次数

Gawk:将数组传递给函数

坚持使用 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)

array awk function

10
推荐指数
1
解决办法
4192
查看次数

完全按原样将参数传递给函数

我有以下功能:

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:

我的问题是如何有效地保留参数的引用。这可能吗?

bash quoting function arguments

10
推荐指数
2
解决办法
2万
查看次数

跟踪某些命令的某些参数

例如,假设我有一个命令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)

但似乎效果不佳。有没有办法做到这一点?

shell bash function

10
推荐指数
1
解决办法
225
查看次数

分配和检查 bash 函数元数据

我经常生成和注册许多 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)

有没有办法将元数据分配给函数,然后再检查它们?使用类型检查定义时可以检索它吗?

bash function

10
推荐指数
3
解决办法
611
查看次数

你能在这个 bash 代码中为我解释这三件事吗?

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)

但是你能帮我解释一下这三件事吗?

  1. d=$d/..
  2. sed 's/^\///'
  3. 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)

shell sed cd-command function variable

10
推荐指数
1
解决办法
1979
查看次数

将函数和变量转发到 sudo su - &lt;user&gt; &lt;&lt;EOF

我已经在 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 ksh sudo environment-variables function

9
推荐指数
1
解决办法
1万
查看次数

zsh 中函数的调用上下文:相当于 bash `caller`

在 bash 中,我可以写:

caller 0
Run Code Online (Sandbox Code Playgroud)

并接收调用者上下文的:

  • 电话号码
  • 功能
  • 脚本名称

这对于调试非常有用。鉴于:

yelp () { caller 0; }
Run Code Online (Sandbox Code Playgroud)

然后我可以写yelp来看看到达了哪些代码行。

我可以实现caller 0bash如下:

echo "${BASH_LINENO[0]} ${FUNCNAME[1]} ${BASH_SOURCE[1]"
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得相同的输出caller 0zsh

shell debugging zsh function

9
推荐指数
1
解决办法
1619
查看次数