做了一些在线搜索,找到了使用命名管道的简单"教程".但是,当我对后台工作做任何事情时,我似乎丢失了大量数据.
[[编辑:发现一个更简单的解决方案,请参阅回复帖子.所以我提出的问题现在是学术性的 - 如果有人想要一个工作服务器]]
使用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) 如何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命令的输出?),但是接受的答案似乎对我不起作用.我不确定我是否应该讨论其他人的问题或发布我自己的副本,所以如果我在这里选错了,请道歉.
我希望得到我正在整理的脚本中的许多命令的输出和退出状态.这是我一直在使用的一个例子:
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有一个很好的功能,关于本地化(语言翻译):
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) 我有一个如下所示的 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 的值。请让我知道如何解决这个问题。
所以,让我说我有以下命令:
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 和 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它是空的。有谁知道我做错了什么?
我不知道如何使用变量执行命令并得到结果.我有很多.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.
我需要将命令的输出分配给变量.我试过的命令是:
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) 如何在 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)这不是我想要的。