标签: bash-functions

bash 函数中的隐式返回?

假设我有一个像这样的 bash 函数:

gmx(){
  echo "foo";
}
Run Code Online (Sandbox Code Playgroud)

这个函数会隐式返回echo命令的退出值,还是需要使用返回值?

gmx(){
  echo "foo";
  return $?
}
Run Code Online (Sandbox Code Playgroud)

我假设 bash 的工作方式,bash 函数的最终命令的退出状态是“返回”的状态,但不是 100% 确定。

bash shell-script bash-functions

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

为什么 sh(不是 bash)抱怨我的 .bashrc 中定义的函数?

当我打开终端会话时,我得到了这个:

sh:为“read.json”导入函数定义时出错

sh:为“ts-project”导入函数定义时出错

sh 不喜欢这些函数,因为它们看起来像:

read.json(){
   ::
}
Run Code Online (Sandbox Code Playgroud)

ts-project(){
   ::
}
Run Code Online (Sandbox Code Playgroud)

真正的问题是 - 为什么要sh触摸/解释这些文件?我在 MacOS 上看到过这个,这真是个谜。我认为只有 bash 会加载这些文件。

更新: bash 和 sh 没什么特别的。当我在终端中输入 bash 时,我得到了这个:

alex$ bash
beginning to load .bashrc
finished loading .bashrc
bash-3.2$ 
Run Code Online (Sandbox Code Playgroud)

当我sh在终端中输入时,我得到以下信息:

alex$ sh
sh: error importing function definition for `read.json'
sh: error importing function definition for `ts-project'
sh-3.2$ 
Run Code Online (Sandbox Code Playgroud)

shell bash bash-functions

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

如何在一行中导出文件中的所有 Bash 函数?

在 Ubuntu 16.04 中,我有一个 Bash 文件,其中包含一些不同的功能,用于在我的系统上自动执行各种常见任务。

我已经获取了该文件,bashrc因此我可以在需要时从终端的任何地方轻松调用每个函数,因此我们可以说“函数本身是来源”。

有时候,我需要使用这些功能源自一个在脚本中,我需要规规矩矩这个动作:

export -f myFunc_0 myFunc_1 myFunc_2 ...
Run Code Online (Sandbox Code Playgroud)

否则,我将无法使用这些功能。


我怎么能对文件中的所有函数进行启动,而不注意特定的函数?

bash bash-functions

7
推荐指数
3
解决办法
5651
查看次数

`set -e` 在 bash 函数中

难道set -e不同的表现在这里

set -e;

function foo {

}
Run Code Online (Sandbox Code Playgroud)

对比

function foo {
  set -e;

}
Run Code Online (Sandbox Code Playgroud)

set -e属于内部的功能呢?set -e在函数外部声明是否会影响 shell 文件中的“嵌套”函数?反过来呢?我们应该叫local set -elol吗?

bash shell-script bash-functions

6
推荐指数
2
解决办法
3802
查看次数

为什么声明 -F 给出了错误的文件

我有两个小函数可以缩写set -x/ set +x,即:

sx () {
    export PS4='+ [${BASH_SOURCE##*/}:${LINENO}]'
    set -x
}
Run Code Online (Sandbox Code Playgroud)

sz () {
    set +x
    export PS4=
}
Run Code Online (Sandbox Code Playgroud)

这两种功能的文件functons.sh距离d ~/.bashrc,并在网上看到这里

登录到一个新的 bash 会话后,我立即尝试找出sz()函数在哪里,如下所示:

$ shopt -s extdebug; declare -F sz; shopt -u extdebug
sz 25 /Users/jab/src/git/hub/jab/src/bash/keyboard/z.sh
Run Code Online (Sandbox Code Playgroud)

这表明bash认为该sz()函数是在 中声明的z.sh,但是在那一行中有一个不同的函数,zzz(),在线这里

sx()函数(以及我所有的无数其他函数)的结果是正确的

$ shopt -s extdebug; declare -F sx; shopt -u extdebug
sx 428 /Users/jab/src/git/hub/jab3/src/bash/functons.sh …
Run Code Online (Sandbox Code Playgroud)

bash bash-functions

6
推荐指数
1
解决办法
471
查看次数

在后台启动功能并保存PID

我有一个包含两个函数的脚本。一个函数将另一个函数作为后台进程启动,并返回该进程的 UID。只要我不想将 PID 放入专用变量中,这种方法就很有效。一旦我尝试将 PID 分配给变量,脚本就会挂起,直到后台操作完成。

此行为可以通过以下脚本演示:

#!/bin/sh

foo () {
    bar &   # start bar in background
    echo $! # return bars' PID
}

bar () {
    sleep 5 # some background operation
}

FOO=$(foo) # remember the PID of bar
echo $FOO  # expectation: should echo immediately
           # reality: echo after five seconds
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:如何让脚本在启动函数后继续执行bar,而不等待bar返回?

shell background-process bash-functions

5
推荐指数
1
解决办法
6635
查看次数

Bash 从一个函数返回一个关联数组,然后将该关联数组传递给其他函数

我正在尝试从通过 arg 传入的列表中的函数中构建关联数组,但它不起作用:

#!/usr/bin/env bash



function cwd {
  echo "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
}


function list_commands {
  local root="$1"
  local command_list="${*:2}"
  declare -A cmds
  for cmd in $command_list; do
    cmds["#{$cmd}"]+="$root/scripts/displays/$cmd.sh #{pane_current_path} #{pane_id}"
  done
  echo "$cmds"
}

PLUGIN_ROOT_DIR="$(cwd)"

declare -A cmds=$(list_commands "$PLUGIN_ROOT_DIR" "rbenv_ruby_ver githud")

main "$cmds"
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做,bash 脚本不是我的强项(虽然我在这方面做得越来越好)

我该怎么做才能完成这项工作?

请记住,这将作为 tpm tmux 插件的一部分在 tmux 中执行。

shell associative-array bash-functions

4
推荐指数
1
解决办法
5961
查看次数

定义和导出函数,无需重复

我知道我可以这样做:

function foo() { echo "foo"; }; export -f foo
Run Code Online (Sandbox Code Playgroud)

但是我可以在不重复函数名称的情况下做到这一点吗?

bash bash-functions

3
推荐指数
1
解决办法
47
查看次数

grep 与 heredoc 的功能

我想制作从粘贴在终端中的文本进行解析的函数。

$ cat <<eof | grep --color sometext
> foo
> sometext
> sometext1
> a sometext
> asdf
> 
> eof
sometext
sometext1
a sometext
Run Code Online (Sandbox Code Playgroud)

虽然上述工作,我既不能做别名也不能做它的功能。

alias gsi='cat <<eof | grep --color "$1"'
gsi { cat <<eof | grep --color "$1" ; }
Run Code Online (Sandbox Code Playgroud)

我认为在函数定义期间没有执行重定向。

bash here-document bash-functions

2
推荐指数
1
解决办法
716
查看次数

除了 bash 中的最后一个参数,我如何回显所有参数?

我有以下

#!/bin/bash
function f1 ()
{
  echo "${@:1:-2}"
}
f1 1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)

我需要 echo1 2 3 4 5 man bash告诉我,当我使用时,@我不能使用负长度。

我求助于使用计算 ( "${@:1:$((${#@}-1))}") 这对我来说似乎是非正统的。

如何从输出中排除最后一个参数?

bash parameter bash-functions

2
推荐指数
1
解决办法
278
查看次数