假设我有一个像这样的 bash 函数:
gmx(){
echo "foo";
}
Run Code Online (Sandbox Code Playgroud)
这个函数会隐式返回echo
命令的退出值,还是需要使用返回值?
gmx(){
echo "foo";
return $?
}
Run Code Online (Sandbox Code Playgroud)
我假设 bash 的工作方式,bash 函数的最终命令的退出状态是“返回”的状态,但不是 100% 确定。
当我打开终端会话时,我得到了这个:
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) 在 Ubuntu 16.04 中,我有一个 Bash 文件,其中包含一些不同的功能,用于在我的系统上自动执行各种常见任务。
我已经获取了该文件,bashrc
因此我可以在需要时从终端的任何地方轻松调用每个函数,因此我们可以说“函数本身是来源”。
有时候,我需要使用这些功能源自一个在脚本中,我需要规规矩矩这个动作:
export -f myFunc_0 myFunc_1 myFunc_2 ...
Run Code Online (Sandbox Code Playgroud)
否则,我将无法使用这些功能。
我怎么能对文件中的所有函数进行启动,而不注意特定的函数?
难道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 -e
lol吗?
我有两个小函数可以缩写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) 我有一个包含两个函数的脚本。一个函数将另一个函数作为后台进程启动,并返回该进程的 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
返回?
我正在尝试从通过 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 中执行。
我知道我可以这样做:
function foo() { echo "foo"; }; export -f foo
Run Code Online (Sandbox Code Playgroud)
但是我可以在不重复函数名称的情况下做到这一点吗?
我想制作从粘贴在终端中的文本进行解析的函数。
$ 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)
我认为在函数定义期间没有执行重定向。
我有以下
#!/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))}"
) 这对我来说似乎是非正统的。
如何从输出中排除最后一个参数?