我目前正在子 shell 中启动后台进程,想知道如何将其 pid 编号分配给子 shell 范围之外的变量?
我尝试了许多不同的方法,但MYPID始终设置为0.
MYPID = 0;
({ sleep 2 & }; $MYPID=$!)
({ sleep 2 & }; echo $!) > $MYPID
Run Code Online (Sandbox Code Playgroud)
它返回值的唯一方法是:
$MYPID=$({ sleep 2 & }; echo $!)
Run Code Online (Sandbox Code Playgroud)
然而,这会丢弃后台进程指令,它只会在 2 秒后返回结果。
如果我有一个变量 x
total=3
Run Code Online (Sandbox Code Playgroud)
然后是一个函数
function A () {
local -i total=0
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以total从函数内部更新“全局”总变量A?
如果我有这样的功能:
TEST()
{
if [[ "$1" == "hi" ]]
then
exit 1
fi
echo "Some text"
}
Run Code Online (Sandbox Code Playgroud)
如果我在当前 shell 中运行该函数:
TEST "hi"
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作。函数中的 if 语句为真,整个脚本将退出。另一方面,如果我这样做:
FUNCTION_OUTPUT=$(TEST "hi")
Run Code Online (Sandbox Code Playgroud)
这样我就可以在变量中从函数中捕获标准输出,函数内的 if 语句仍然为真,“exit 1”仍将触发,但由于我们在子 shell 中运行,脚本将继续运行。
不是使用 VAR_NAME=$() 在子shell中运行某些东西并将其分配给变量,有没有办法在当前shell中运行它,以便我的函数中的“exit 1”行实际上退出整个脚本?
bash 变量中可接受的字符是什么?
有人可以指出我 bash 手册页中描述 bash 变量可接受名称的地方吗?
我查看并提出了很多信息(请参阅问题编辑),但没有明确的答案。
我有一个参数列表和三个过程:
bash_script -> child -> grandchild
Run Code Online (Sandbox Code Playgroud)
参数列表是针对孙子的。我可以修改所有三个进程。祖父脚本为自己获得了一个参数。
以下是将剩余参数传递给孙子的正确方法吗?
#!/usr/bin/env bash
# This is the grandfather
first_arg="$1"
shift 1;
export MY_ARGS="$@"
Run Code Online (Sandbox Code Playgroud)
我稍后在子进程中“传播”了 env 变量,作为调用孙子进程的命令的一部分,例如:
grandchild --foo "$MY_ARGS" # append $MY_ARGS as arguments to foo
Run Code Online (Sandbox Code Playgroud) 我的目标是调用一个命令,在一个变量中获取 stderr,但在屏幕上保留 stdout(并且只有 stdout)。是的,这与大多数人所做的相反:)
目前,我拥有的最好的是:
#!/bin/bash
pull=$(sudo ./pull "${TAG}" 2>&1)
pull_code=$?
if [[ ! "${pull_code}" -eq 0 ]]; then
error "[${pull_code}] ${pull}"
exit "${E_PULL_FAILED}"
fi
echo "${pull}"
Run Code Online (Sandbox Code Playgroud)
但这只能在成功的情况下显示标准输出,并且在命令完成后。我想直播标准输出,这可能吗?
编辑
感谢@sebasth,并在没有临时文件的情况下将 STDERR 和 STDOUT 重定向到不同变量的帮助下,我写了这个:
#!/bin/bash
{
sudo ./pull "${TAG}" 2> /dev/fd/3
pull_code=$?
if [[ ! "${pull_code}" -eq 0 ]]; then
echo "[${pull_code}] $(cat<&3)"
exit "${E_PULL_FAILED}"
fi
} 3<<EOF
EOF
Run Code Online (Sandbox Code Playgroud)
我承认这不是真正的“美丽”,看起来很棘手,而且我真的不明白为什么需要heredoc ......
这是实现这一目标的更好方法吗?
鉴于我有一个 bash 脚本
ev=USER
Run Code Online (Sandbox Code Playgroud)
如何使用 ev 获取 $USER 的环境变量值?
尝试天真地做:
echo ${"$"$ev}
Run Code Online (Sandbox Code Playgroud)
这导致糟糕的替代。
我希望能取回 $USER 的任何价值。
我认为一个例子最能解释我需要什么
_v1="windows"
_v2_windows="/mnt/d"
_v2_osx="/Volumes/d"
echo $_v2_`echo $_v1`
Run Code Online (Sandbox Code Playgroud)
我想回应_v2_windows但使用的值_v1来确定v2要获取两个s 中的哪一个。
我知道可以使用case语句来解决问题,但我试图避免这种情况。
我有一个脚本,我想在其中使用命令列出 USB 设备lsblk。
命令:
$ lsblk -o NAME,TRAN,VENDOR,MODEL | grep usb
Run Code Online (Sandbox Code Playgroud)
这导致
sdb usb Kingston DataTraveler 2.0
sdc usb Kingston DT 101 G2
Run Code Online (Sandbox Code Playgroud)
我想将结果保存在一个变量中以便以后工作,所以我写
$ usbs=$(lsblk -o NAME,TRAN,VENDOR,MODEL | grep usb)
Run Code Online (Sandbox Code Playgroud)
我期待的是变量usbs将结果存储在两整行中,如上所示。但如果我跑:
for i in ${usbs[@]}; do
echo $i
done
Run Code Online (Sandbox Code Playgroud)
我把结果分成几个词:
sdb
usb
Kingston
DataTraveler
2.0
sdc
usb
Kingston
DT
101
G2
Run Code Online (Sandbox Code Playgroud)
问题:
有没有办法,使用grep命令,我可以将命令的结果存储为两整行?
我更愿意知道是否有一个简单的解决方案,而不是将结果转储到文件中然后读取它。
以下脚本:
$ cat runme01.sh
#!/bin/bash
A=myval
B=$A/{fix}
C=$A/fix
set -xT
echo $B
echo $C
Run Code Online (Sandbox Code Playgroud)
如果运行,则打印以下内容:
$ ./runme01.sh
+ echo 'myval/{fix}'
myval/{fix}
+ echo myval/fix
myval/fix
Run Code Online (Sandbox Code Playgroud)
如您所见,变量 B传递给echo在单引号,而变量C传递W / O他们。
可能是花括号导致了这种情况。
我想总是不带引号地传递它们。怎么做?