AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-146169

MatrixManAtYrService's questions

Martin Hope
MatrixManAtYrService
Asked: 2019-12-21 13:34:39 +0800 CST

为什么 zsh 等待这个命令完成,而 bash 在它完成之前写入提示?

  • 1

这是命令:

{ ( echo "to stdout"; echo "to stderr" >&2 ) > >(sleep 1; tee stdout.txt); } 2> >(sleep 2; tee stderr.txt >&2 )

这就是我所看到的:

zsh

% { ( echo "to stdout"; echo "to stderr" >&2 ) > >(sleep 1; tee stdout.txt); } 2> >(sleep 2; tee stderr.txt >&2 )
to stdout
to stderr
%

重击

$ { ( echo "to stdout"; echo "to stderr" >&2 ) > >(sleep 1; tee stdout.txt); } 2> >(sleep 2; tee stderr.txt >&2 )
$ to stdout
to stderr

请注意, bash$在输出完成之前写入它的提示,但 zsh 在提示用户之前等待替换的进程完成%。

我想一个合理的答案可能是“因为这就是 zsh 的工作方式”,但我想知道这是否记录在任何地方,以便我可以了解更多信息。作为许多 bash 用户中的 zsh 用户,我尝试了解差异,以便知道当我说“嘿,运行这个命令”时会发生什么。

(相关问题:https ://stackoverflow.com/a/53051506/1054322 )

bash zsh
  • 1 个回答
  • 960 Views
Martin Hope
MatrixManAtYrService
Asked: 2019-09-10 14:23:26 +0800 CST

如何检查我的函数是否使用来自管道的输入调用?

  • 5

我通常if [ -t 0 ]用来测试标准输入并if [ -t 1 ]查看标准输入和标准输出是否是 TTY,如果不是,我假设它们是管道。我最近了解到这是一个糟糕的假设:

function context()
{
    if [ -t 0 ]
    then
        if [ -t 1 ]
        then
            echo "no pipes"
        else
            echo "pipe out only"
        fi
    else
        if [ -t 1 ]
        then
            echo "pipe in only"
        else
            echo "pipe in and out"
        fi
    fi
}

echo "No Loop:"        # these cases work as desired
context
echo 'f' | context
echo 'f' | context | cat
context | cat

echo
echo "Loop:"
echo $'foo
bar' | while read x
do
    context             # I want this to say "no pipes"
    echo 'f' | context
done

上面 bash 的输出是这样的:

No Loop:
no pipes
pipe in only
pipe in and out
pipe out only

Loop:
pipe in only
pipe in only
pipe in only
pipe in only

如何更改 to 的定义,context以便第 5 次和第 7 次调用打印“无管道”?

也就是说,我不想测试标准输入是否不是终端(这会导致问题),而是测试这个特定函数的标准输入是否恰好是管道。我看到它-p检查它是否是命名管道,但我希望它用于匿名管道。

编辑

实际用例涉及我们将调用的函数theDb来代替context. 理想情况下,无论上下文如何,以下两种情况都是等效的:

cat file_with_some_sql | theDb
theDb "sql goes here"
bash
  • 1 个回答
  • 550 Views
Martin Hope
MatrixManAtYrService
Asked: 2019-08-26 12:24:40 +0800 CST

为什么从 base64 转换并返回此字符串的末尾会出现乱码?

  • 0

命令:

echo "HelloWorld==" | base64 -d | base64

输出:

HelloWorlQ==

为什么我的d现在是一个Q?

编辑:

我不想从任意数据开始并对其进行 base64 编码。我的意图是从 Base64 开始并以 Base64 结束,在此期间只产生了一个二进制值。

编辑 2:

我注意到如果输入字符串是四个字符的倍数,则不会发生这种情况,所以我认为这是与填充的交互:

❯ echo 'abcdefghij==' | base64 -d | base64
abcdefghig==

❯ echo 'abcdefgh' | base64 -d | base64 
abcdefgh

编辑 3

删除了对标志的混淆提及-i,结果证明这与我的问题无关。

base64
  • 3 个回答
  • 3523 Views
Martin Hope
MatrixManAtYrService
Asked: 2019-05-05 08:10:19 +0800 CST

当使用 errexit (-e) 运行时,我怎么能期望一个非零返回码,否则会失败?

  • 0

启用 errexit 选项后,任何失败的命令都会导致脚本退出。对于某些预期会失败的命令,我想反转此行为。那就是:我只想在指示的命令失败时继续。

我目前正在做这样的事情,这很丑陋:

some_test() { 
    # retuns nonzero if some condition is met, and zero otherwise
}

some_change() {
    # makes a change that should alter the return code of the above test
}

set -e

some_test
echo "expected success, found it"

some_change

set +e
some_test           # expect failure

if [[ $? -eq 0 ]]
then
   echo "expected failure, found success"
   exit(1)
else
   echo "expected failure, found it"
fi

set -e

# ...more testing below

我正在寻找更简洁的东西。我知道我可以容忍这样的失败命令:

some_test
some_change
some_test && true

但我不想仅仅容忍失败,我想断言失败。如果第二个测试通过,我希望我的脚本失败。

bash
  • 1 个回答
  • 149 Views
Martin Hope
MatrixManAtYrService
Asked: 2018-12-01 14:37:53 +0800 CST

单个管道入口是否可以查看整个管道?

  • 0

我有一个func可以生成表格输出或 json 输出的 tion。我知道处理这个问题的常规方法是使用这样的参数:

$ func -j | jq .firstField
$ func -t | awk '{print $1}'

我想“向前看”并根据管道中的下一阶段推断输出类型。理想的用法很简单:

$ func | jq .firstField
$ func | awk '{print $1}'

我想象在 func 的某个地方,我会检查管道中下一阶段的第 0 个参数,看看它是否包含一个j. 如果是这样,我会生成 json,否则会生成表格。

bash 允许这样的巫术吗?如果是这样,怎么做?

bash
  • 2 个回答
  • 191 Views
Martin Hope
MatrixManAtYrService
Asked: 2018-10-08 09:01:26 +0800 CST

我怎么知道写入命名管道是否会阻塞?

  • 7

只有当它已经有一个阅读器时,我才想写入一个命名管道。目前,我正在使用timeout来检测写入管道的尝试是否被阻止,如下所示:

#! /usr/bin/env bash
rm -f pipe
mkfifo pipe
sleep 5

timeout 1 bash -c "echo Hello > pipe"

if [[ $? == 0 ]]
then
    echo Somebody got our message
else
    echo Nobody read from pipe, so we didn\'t send a message
fi

这行得通。如果我tail -f pipe在睡眠期间处于单独的终端中,我会收到一条消息,如果我没有,我会收到另一条消息。但是有更好的方法吗?理想情况下,这将是不依赖于超时的东西。

bash fifo
  • 1 个回答
  • 3182 Views
Martin Hope
MatrixManAtYrService
Asked: 2018-09-16 13:21:33 +0800 CST

如何使用 ssh-agent 抑制主机密钥检查

  • 8

我有一个带有这个片段的脚本:

ssh-agent bash -c "ssh-add $SOME_KEY; \
                   git submodule update --init foo"

脚本在询问用户时挂起:

RSA 密钥指纹为 SHA256:[指纹]

您确定要继续连接(是/否)?

如何使脚本继续(是)?


  • 我知道我可以调用ssh -o StrictHostKeyChecking=no来禁用它,但我调用的是gitnot ssh。

  • 我知道我可以配置~/.ssh/config为禁用对该主机的严格密钥检查——但我不想修改用户的系​​统。

  • 我知道我可以chmod 000 ~/.ssh/known_hosts禁用该用户的密钥检查,但我不想修改用户的系​​统

  • yes | 我以为我可以在前面插入,git但它似乎不起作用。

git ssh-agent
  • 1 个回答
  • 8988 Views
Martin Hope
MatrixManAtYrService
Asked: 2018-09-10 10:09:52 +0800 CST

我可以为终端会话分别记录用户输入和程序输出吗?

  • 0

我希望我能做script这样的工作:

❯ script --user=call.log --prog=response.log
    Script started

❯ echo foo
    foo

❯ exit
    Script done

❯ cat call.log
    echo foo

❯ cat response.log
    foo

既然没有,我正在寻找替代品。

查看显示的实际输出如下script所示:

^M^[[35m❯ ^[[Ke^Hecho foo#[[?1l^[>^?2004l^M^M
^[]0;tmp: echo foo^Gfoo^M

我考虑过编写一个解析器来提取我想要的东西——但这看起来很脆弱,尤其是因为它似乎取决于用户的 shell 配置。

有没有更好的方法来分别记录会话的来龙去脉?

logs tty
  • 1 个回答
  • 143 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve