标签: variable

将 Subshel​​l 后台进程 pid 分配给变量

我目前正在子 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 秒后返回结果。

shell bash subshell variable

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

即使存在同名的局部范围变量,我也可以引用全局变量吗?

如果我有一个变量 x

total=3
Run Code Online (Sandbox Code Playgroud)

然后是一个函数

function A () {
    local -i total=0
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以total从函数内部更新“全局”总变量A

shell-script variable

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

如何在不在子 shell 中运行命令的情况下将命令的输出分配给变量?

如果我有这样的功能:

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 shell-script variable

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

bash 变量可接受的初始字符列表

bash 变量中可接受的字符是什么?

有人可以指出我 bash 手册页中描述 bash 变量可接受名称的地方吗?

我查看并提出了很多信息(请参阅问题编辑),但没有明确的答案。

bash variable syntax

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

传递参数以在孙进程中使用

我有一个参数列表和三个过程:

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)

bash shell-script environment-variables arguments variable

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

如何在变量中重定向 stderr 但在控制台中保留 stdout

我的目标是调用一个命令,在一个变量中获取 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 terminal stdout stderr variable

5
推荐指数
2
解决办法
5794
查看次数

间接访问环境变量

鉴于我有一个 bash 脚本

ev=USER
Run Code Online (Sandbox Code Playgroud)

如何使用 ev 获取 $USER 的环境变量值?

尝试天真地做:

echo ${"$"$ev}
Run Code Online (Sandbox Code Playgroud)

这导致糟糕的替代。

我希望能取回 $USER 的任何价值。

bash variable

5
推荐指数
2
解决办法
1281
查看次数

zsh:如何根据另一个变量获取变量的值?

我认为一个例子最能解释我需要什么

_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语句来解决问题,但我试图避免这种情况。

zsh variable

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

在bash中迭代字符串变量行

我有一个脚本,我想在其中使用命令列出 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命令,我可以将命令的结果存储为两整行?

我更愿意知道是否有一个简单的解决方案,而不是将结果转储到文件中然后读取它。

grep bash usb variable lsblk

5
推荐指数
2
解决办法
2005
查看次数

如何在bash脚本中渲染没有引号的变量?

以下脚本:

$ 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他们。

可能是花括号导致了这种情况。

我想总是不带引号地传递它们。怎么做?

bash quoting variable

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