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-189571

Whimusical's questions

Martin Hope
Whimusical
Asked: 2024-04-14 01:12:45 +0800 CST

了解重定向函数调用输出使变量突变不可见的效果

  • 6

我在 mac 中的 zsh 5.9 中观察到一个奇怪的行为。(以下是重现错误的简化,它并不试图有意义)。如果我在终端中执行

$> function assigner() { OPTIONS=mutated } 
$> function main() { typeset OPTIONS; assigner; echo $OPTIONS }  
$> main

这输出:

mutated

但是如果我巧妙地更改 main 函数以重定向内部函数调用的输出......

$> function main() { typeset OPTIONS; assigner | cat; echo $OPTIONS }

然后结果就是空白

我的 OPTIONS var 不再填充。这里发生了什么?

zsh
  • 1 个回答
  • 54 Views
Martin Hope
Whimusical
Asked: 2024-03-25 05:33:27 +0800 CST

将 sleep 命令传递给 tmux new-session -d 和不传递任何内容有什么区别?

  • 5

我正在玩一个在这个答案之后将文本发送到 tmux stdin 的脚本(https://unix.stackexchange.com/a/773049/189571 by @Kamil Maciorowski),我错误地这样做了

tty=$(tmux new-session -d -s aux -PF "#{pane_tty}")
echo -n foo > $tty && tput cr > $tty && echo bar > $tty
tmux capture-pane -t aux -p -S0 -E3

结果是foo PROMPT %> bar(不确定地排序,并打印 PROMPT)

而按照卡米尔的建议,相同但使用命令tail -f /dev/null作为 tmux new-session 的参数,给出barresult ,这是我所期望的

我想了解为什么没有尾巴一切都会失败。这里不就是tail -f /dev/null一个吗sleep infinity?与不传递任何命令有什么区别?我的意思是,如果您不将任何内容传递给新会话,则该窗格将保持活动状态,直到终止会话为止

tmux
  • 1 个回答
  • 25 Views
Martin Hope
Whimusical
Asked: 2024-03-25 05:01:27 +0800 CST

xterm 和 screen 之间的 TERM ANSI 转义序列兼容性,尽管 infocmp 没有这么说

  • 5

我正在 Mac 上的 zsh 中制作一个使用 tmux 的脚本,在令人惊叹的https://unix.stackexchange.com/users/22565/st%c3%a9phane-chazelas回答之后,我发现当我使用 tmux 时,它使用与我的主机不同的解释器。

因此,当我从脚本 tput 命令向 tty 和 tmux 窗格输出相同的文字时,我想知道我正在生成的 ANSI 转义序列是否存在一些不兼容性。

我发现 $TERM 在我的 mac 中是 xterm-256color,在 tmux 窗格中是 screen-256color,因此我发出

%> infocmp xterm-256color screen-256color

我正在使用使用 tput clear、civis、sgr0、cnorm、rc、sc、home、cd、cr、el、cub1、cud、cuf 的代码。代码正在运行,输出是在 xterm 上下文中使用 tput 生成的,并且在 tee 时在 tty 和 tmux 上都能很好地呈现。

但根据 infocmp 的说法,例如,clear 在这两个术语上都有不同的转义序列:

comparing xterm-256color to screen-256color.
        clear: '\E[H\E[2J', '\E[H\E[J'

那么它如何运作呢?

作为一个附带问题,我的命令的 msot 没有出现在比较中,这是否意味着它们在理论上不受支持,或者它们在这两个术语中都很常见?

tmux
  • 1 个回答
  • 20 Views
Martin Hope
Whimusical
Asked: 2024-03-23 08:19:58 +0800 CST

将脚本的标准输出重定向为 tmux 会话中运行的另一个脚本/命令的标准输入

  • 5

我正在改编Marcus Müller 对我上周提出的问题的回答 - 一个将其标准输出重定向到 tmux 会话以渲染 ANSI 转义序列的脚本,然后捕获窗格渲染作为脚本的真实输出。我知道它根本没有用,因为您可以将其直接打印到标准输出并获得相同的结果,但这只是一个演示,可以将代码带到一个更大的项目,更复杂的解释,我需要这个功能:

#!/bin/zsh

tmpdir="$(mktemp -d)"
fifo="${tmpdir}/fifo"
mkfifo "$fifo"
tmux new-session -d -s aux "while true; do cat ${fifo}; done"

exec 3>&1 1>"$fifo"


echo foo
echo bar
tput home
echo -n b

exec 1>&3 3>&-

tmux capture-pane -t "aux" -p -S0 -E1
tmux kill-session -t aux
rm -rf $tmpdir

其输出(并且必须):

boo
bar

我对简化代码感兴趣。是否可以使用任何与标准输入重定向相关的技巧,而不是需要维护的 fifo?我可以使用单行程序以某种方式继续打印所有内容并在完成后自动关闭会话吗?

我尝试使用 tmux 管道窗格、缓冲区、发送键和 run-shell,但无法成功。特别是当会话采用标准输入时,就像您在控制台上编写命令一样,而不是像正在运行的命令/脚本的脚本的标准输入一样

我觉得它必须以某种方式简化。

zsh
  • 3 个回答
  • 73 Views
Martin Hope
Whimusical
Asked: 2024-03-16 17:41:39 +0800 CST

如何从使用 tput 的命令“渲染”输出,以便仅保留最终的终端后处理结果?

  • 7

我捕获了使用 tput 在屏幕上绘制某些内容的脚本的输出。当我执行 cat myoutput 时,一切都很清楚(看起来终端从头开始重新解释它),但是当我编辑或管道输出时,我看到大量的 ansi 序列以及破坏性打印之前的所有内容,例如 tput clear 等。

我怎样才能对其进行后处理,以便我只得到最终的“渲染”?

更好的是,其根源是我目前正在编写我的脚本,因此它将除了终端之外的所有内容都打印到文件中

和exec > >(tee /dev/tty)

有没有办法告诉标准输出通道在保存之前“渲染”所有内容?

zsh
  • 1 个回答
  • 35 Views
Martin Hope
Whimusical
Asked: 2024-03-11 08:32:48 +0800 CST

在 zsh 中使用 -u 和 -k 进行读取的问题

  • 5

我正在开发一个使用 read -k 的 zsh 脚本。如果我像这样执行脚本 ( echo a | myscript),它将无法获取输入。显然,这是由于 -k 始终使用 /dev/tty 作为标准输入,并且您必须告诉 read 使用标准输入,如read -u0.

但是,如果我将其更改为 -u0 (这使得之前的情况有效)并在不重定向 tty 的情况下执行我的脚本,它会破坏脚本,它根本不会像在没有 -u0 的情况下执行它一样。

编辑:调试后,问题似乎很简单,使用 -u0 后, -k1 选项不再读取单个字符并停止。在这种情况下,read 的工作方式与没有 -k 时一样,只是缓冲所有输入并在 EOL 到达时立即保存它

EDIT2:经过更多调试后,我知道这与原始模式无法与 -u0 一起使用有关。如果我在读取之前添加 stty raw/cooked 那么它就可以工作(除了现在使用 \r 而不是 \n 处理输入击键),但是当我使用非 tty stdin 执行它时它会中断。

有什么办法可以让两种模式兼容吗?

事实上,我想了解为什么脚本的行为完全不同,无论我是否使用 -u0 读取,fd0 默认情况下与 /dev/tty 相同

zsh
  • 1 个回答
  • 48 Views
Martin Hope
Whimusical
Asked: 2024-02-25 02:52:52 +0800 CST

从终端读取输入的脚本。如果使用 stdout 重定向调用脚本,如何告诉脚本打印到 tty 和 stdout?

  • 5

我有一个脚本要求用户在终端中输入,因此,如果使用重定向到文件的 stdout 调用脚本,则用户在提示符上没有上下文。所以我想将标准输出复制到两个站点。

该脚本输出一个微积分,因此允许 stdout 重定向仍然有意义。

但是如果提供了 stdin(类似于 yes 命令或非交互式上下文,如 cron),则完全允许输出在 tty 中不需要是有意义的。

所以我想做一些类似的逻辑:

If (test -t 0 && ! test -t 1);
  // Tell stdout to print everything  to tty as well

这可能吗?还是根本上就不合适?

shell-script
  • 1 个回答
  • 38 Views
Martin Hope
Whimusical
Asked: 2024-02-25 01:41:21 +0800 CST

如何识别哪些文件描述符与 STDIN、STDOUT 等关联

  • 5

我似乎记得一些命令或环境变量告诉你这一点。例如,我基本上想要在终端上执行的东西,给你

echo $STDIN 
/dev/tty
echo $STDOUT
/dev/tty
fdescribe 0 or fdescribe /dev/stdin
/dev/tty
fdescribe 1 or fdescribe /dev/stdout
/dev/tty

但可以在脚本或子进程中执行

stdout
  • 1 个回答
  • 23 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