相关疑难解决方法(0)

使用带有bash的命名管道 - 数据丢失问题

做了一些在线搜索,找到了使用命名管道的简单"教程".但是,当我对后台工作做任何事情时,我似乎丢失了大量数据.

[[编辑:发现一个更简单的解决方案,请参阅回复帖子.所以我提出的问题现在是学术性的 - 如果有人想要一个工作服务器]]

使用Ubuntu 10.04和Linux 2.6.32-25-generic#45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux

GNU bash,版本4.1.5(1)-release(x86_64-pc-linux-gnu).

我的bash功能是:

function jqs
{
  pipe=/tmp/__job_control_manager__
  trap "rm -f $pipe; exit"  EXIT SIGKILL

  if [[ ! -p "$pipe" ]]; then
      mkfifo "$pipe"
  fi

  while true
  do
    if read txt <"$pipe"
    then
      echo "$(date +'%Y'): new text is [[$txt]]"

      if [[ "$txt" == 'quit' ]]
      then
    break
      fi
    fi
  done
}
Run Code Online (Sandbox Code Playgroud)

我在后台运行:

> jqs&
[1] 5336
Run Code Online (Sandbox Code Playgroud)

现在我喂它:

for i in 1 2 3 4 …
Run Code Online (Sandbox Code Playgroud)

linux bash named-pipes data-loss

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

通过管道从子shell获取退出代码

如何wget从子shell进程获取退出代码?

所以,主要问题是$?等于0.哪里可以$?=8建立?

$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "$?"
0
Run Code Online (Sandbox Code Playgroud)

tee实际上它没有用.

$> OUT=$( wget -q "http://budueba.com/net" ); echo "$?"
8
Run Code Online (Sandbox Code Playgroud)

但是${PIPESTATUS}数组(我不确定它与那种情况有关)也不包含该值.

$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[1]}"    

$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[0]}"
0

$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[-1]}"
0
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是 - 如何wget通过tee子shell …

bash pipe exit-code tee subshell

13
推荐指数
2
解决办法
7692
查看次数

如何在变量中输出bash命令

我一直在关注一些类似的问题(例如如何将变量设置为Bash命令的输出?),但是接受的答案似乎对我不起作用.我不确定我是否应该讨论其他人的问题或发布我自己的副本,所以如果我在这里选错了,请道歉.

我希望得到我正在整理的脚本中的许多命令的输出和退出状态.这是我一直在使用的一个例子:

cmd_output=$(rm $file)
exit_status=$?
if [ "${exit_status}" -eq 0 ]
then
log "Successfully removed the original" ${TAB_LEVEL}
else
fail "Failed to remove the original, the output was: \n ${cmd_output}"
fi
Run Code Online (Sandbox Code Playgroud)

日志和失败函数是:

# Usage: fail "Failure message"
function fail {
echo "FATAL ERROR: $1" >> "${LOG_DIR}/${LOG_FILE}"
exit 1
}

# Usage: log "Log message" 3    Where the tab-level is 3.
function log {
if (("${2}" > 0))
then
eval "printf '    %.0s' {1..$2}" >> "${LOG_DIR}/${LOG_FILE}"
fi
echo "$1" …
Run Code Online (Sandbox Code Playgroud)

bash shell ubuntu command-line

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

bash本地化不适用于多行字符串(具有强语法或通过`eval`)

bash有一个很好的功能,关于本地化(语言翻译):

TEXTDOMAIN=coreutils
LANG=fr_CH.utf8
echo $"system boot"
démarrage système
Run Code Online (Sandbox Code Playgroud)

(注意:对于这项工作,fr_CH.utf8已经在您的系统上生成了......否则您可以尝试使用自己的语言环境...或者安装locales并生成一个.)

问题:

但是如果这对于简单的字符串工作正常,那么当字符串包含一个\n(或者最坏的:一个反引号时,`事情会更复杂:

echo $"Written by %s, %s, %s,\nand %s.\n"
Written by %s, %s, %s,\nand %s.\n
Run Code Online (Sandbox Code Playgroud)

这不是参加的答案.

(Nota2:对于这项工作,必须在消息文件中准备确切的消息.mo,在此示例/测试中,我使用的是existant coreutils.mo文件,可以使用该命令取消格式化msgunfmt.)

总之,我发现进行翻译的唯一方法是:

eval echo \$\"$'Written by %s, %s, %s,\nand %s.\n'\"
Écrit par %s, %s, %s,
et %s.
Run Code Online (Sandbox Code Playgroud)

要么

msg=$'Written by %s, %s, %s,\nand %s.\n'
eval echo \$\""$msg"\"
Écrit par %s, %s, %s, …
Run Code Online (Sandbox Code Playgroud)

bash localization

12
推荐指数
1
解决办法
675
查看次数

在 for 循环 bash 中使用 yq

我有一个如下所示的 yaml 数组,

identitymappings:
- arn: "arn:aws:iam::12345567:role/AdmRole"
  group: "system:masters"
  user: "user1"
- arn: "arn:aws:iam::12345567:role/TestRole"
  group: "system:masters"
  user: "user2"
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 for 循环和 yq 在 bash 脚本中解析此 yaml。

 for identityMapping in $(yq read test.yaml "identitymappings[*]"); do
      roleArn=$identityMapping["arn"]
      group=$identityMapping.group
      user=$identityMapping.user
done
Run Code Online (Sandbox Code Playgroud)

但我没有得到预期的结果,例如无法获取 roleArn、group、user 的值。请让我知道如何解决这个问题。

bash yq

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

如何在bash中将curl的输出捕获到变量

所以,让我说我有以下命令:

curl -I http://google.com | head -n 1| cut -d $' ' -f2
Run Code Online (Sandbox Code Playgroud)

这将捕获http状态代码?? 现在我想在bash脚本中将它赋给变量..

like output = "curl -I http://localhost:8088/tracks?key=9 | head -n 1| cut -d $' ' -f2" 
Run Code Online (Sandbox Code Playgroud)

或类似的东西..

如何将上述命令的响应分配给bash中名为output的变量?谢谢

bash shell curl

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

如何将 bash 命令的输出存储在变量中?

我正在尝试编写一个简单的脚本来终止进程。我已经阅读了使用 bash 和 regex 在一行中查找并终止进程,所以请不要将我重定向到该处。

这是我的代码:

LINE=$(ps aux | grep '$1')
PROCESS=$LINE | awk '{print $2}'
echo $PROCESS
kill -9 $PROCESS
Run Code Online (Sandbox Code Playgroud)

我希望能够运行类似的东西

sh kill_proc.sh node 让它运行

kill -9 node

但我得到的是

kill_process.sh: line 2: User: command not found
Run Code Online (Sandbox Code Playgroud)

我发现当我登录时$PROCESS它是空的。有谁知道我做错了什么?

bash shell sh

8
推荐指数
1
解决办法
7264
查看次数

BASH脚本 - 执行带变量和存储结果的命令

我不知道如何使用变量执行命令并得到结果.我有很多.h.c文件,我需要从ISO-8859转换为UTF-8.

所以我做:

ls | grep "\.[ch]" | xargs myscript.sh
Run Code Online (Sandbox Code Playgroud)

在我的脚本中变量$1是文件名.现在我需要表演

iconv -f ISO-8859 -t UTF-8 $1
Run Code Online (Sandbox Code Playgroud)

并存储此结果,因为iconv打印到stdout.

result=`iconv -f ISO-8859 -t UTF-8 $1`

echo $result 
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用,因为它给了我一些不匹配而不是转换$1.

unix bash shell

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

将命令的输出分配给变量(BASH)

我需要将命令的输出分配给变量.我试过的命令是:

grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}'
Run Code Online (Sandbox Code Playgroud)

我尝试使用此代码来分配变量:

UUID=$(grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}')
Run Code Online (Sandbox Code Playgroud)

但是,它会产生语法错误.另外我希望它在bash脚本中工作.

错误是:

./upload.sh: line 12: syntax error near unexpected token ENE=$( grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}'
 )'

./upload.sh: line 12:   ENE=$( grep UUID fstab | awk '/ext4/ {print $1}' | awk '{print substr($0,6)}'
 )'
Run Code Online (Sandbox Code Playgroud)

linux bash shell command

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

如何在 Linux Bash 中获取命令输出的一部分?

如何在 Bash 中获取命令输出的一部分?

例如,命令php -v输出:

PHP 5.3.28 (cli) (built: Jun 23 2014 16:25:09)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies with the ionCube PHP Loader v4.6.1, Copyright (c) 2002-2014, by ionCube Ltd.
Run Code Online (Sandbox Code Playgroud)

我只想输出PHP 5.3.28 (cli)部分。我怎么做?

我试过php -v | grep 'PHP 5.3.28',但输出:PHP 5.3.28 (cli) (built: Jun 23 2014 16:25:09)这不是我想要的。

linux bash

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

标签 统计

bash ×10

shell ×5

linux ×3

command ×1

command-line ×1

curl ×1

data-loss ×1

exit-code ×1

localization ×1

named-pipes ×1

pipe ×1

sh ×1

subshell ×1

tee ×1

ubuntu ×1

unix ×1

yq ×1