Articles of unix

你可以欺骗isatty并单独loginstdout和stderr吗?

问题 所以你要logging一个进程或subprocess的stdout和stderr(单独的),如果你没有logging任何东西,输出和你在terminal中看到的不一样。 似乎很简单没有? 不幸的是,似乎不可能为这个问题写出一个通用的解决scheme,这对任何给定的过程都有效。 背景 pipe道redirect是分离标准输出和标准错误的一种方法,允许您单独logging它们。 不幸的是,如果将stdout / err更改为pipe道,则进程可能会检测到pipe道不是tty(因为它没有宽度/高度,波特率等),并可能相应地改变其行为。 为什么改变行为? 那么,有些开发人员利用terminal的function,如果你正在写出一个文件,这是没有意义的。 例如,加载栏通常需要将terminal光标移回到行的开始位置,并使用新长度的栏来覆盖以前的加载栏。 颜色和字体重量也可以显示在terminal中,但是在平面ASCII文件中不能。 如果要将这样一个程序的标准输出直接写入文件,则该输出将包含所有terminal的ANSI转义码,而不是格式正确的输出。 因此,开发人员在向stdout / err写入任何内容之前都会执行某种“isatty”检查,因此如果该检查返回false,则可以为文件提供更简单的输出。 这里通常的解决scheme是欺骗这样的程序,通过使用一个pty(一个双向pipe道,也有宽度,高度等等)来认为pipe道实际上是tty。你将进程的所有input/输出redirect到这个pty,处理成思考它与真实的terminal交谈(你可以直接把它logging到文件中)。 唯一的问题是,通过使用stdout和stderr的单个pty,我们现在不能再区分这两者了。 所以你可能想为每个pipe道尝试一个不同的pty,一个是stdin,一个是stdout,另一个是stderr。 虽然这将在50%的时间内运行,但许多进程不幸的是会执行额外的redirect检查,以确保stdout和stderr(/ dev / tty000x)的输出path是相同的。 如果它们不是,那么必须有redirect,因此它们会给你一样的行为,就好像你已经用stdout和stdout没有pty一样。 你可能会认为这种redirect检查是不常见的,但不幸的是,这实际上是非常普遍的,因为很多程序都重复使用其他代码来检查,就像在OSX中find这样的代码: http://src.gnu-darwin.org/src/bin/stty/util.c 挑战 我认为寻找解决scheme的最佳方式是以挑战的forms。 如果任何人都可以运行下面的脚本(理想情况下通过Python,但在这一点上我会采取任何东西),stdout和stderr分别logging,你设法愚弄它认为它是通过一个tty,你解决了这个问题:) #!/usr/bin/python import os import sys if sys.stdout.isatty() and sys.stderr.isatty() and os.ttyname(sys.stdout.fileno()) == os.ttyname(sys.stderr.fileno()): sys.stdout.write("This is a") sys.stderr.write("real tty :)") else: sys.stdout.write("You cant fool me!") sys.stdout.flush() […]

分析shell脚本参数

$myscript.sh -host blah -user blah -pass blah 我想把论据传递给它。 我习惯做$1 , $2 , $3 ….但我想开始命名它们

如何在预期的shell脚本中获得产生的进程的退出代码?

我试图执行一个脚本,执行一个EXPECT脚本和一个派生的过程,它有退出代码。 但是我无法将产生的进程的退出代码获得到主脚本。 成功的时候我一直都是零。 期望脚本是: [Linux Dev:anr ]$ cat testexit.sh #!/bin/bash export tmp_script_file="/home/anr/tmp_script_temp.sh" cp /home/anr/tmp_script $tmp_script_file chmod a+x $tmp_script_file cat $tmp_script_file expect << 'EOF' set timeout -1 spawn $env(tmp_script_file) expect { "INVALID " { exit 4 } timeout { exit 4 } } EOF echo "spawned process status" $? rm -f $tmp_script_file echo "done" 衍生的脚本: [Linux […]

如何使用Shell脚本读取包含具有句点字符的键的.properties文件

我正在尝试从包含句点(。)字符的shell脚本读取属性文件,如下所示: # app.properties db.uat.user=saple user db.uat.passwd=secret #/bin/sh function pause(){ read -p "$*" } file="./app.properties" if [ -f "$file" ] then echo "$file found." . $file echo "User Id " $db.uat.user echo "user password =" $db.uat.passwd else echo "$file not found." fi 我已经试图parsing文件后,源文件,但它不工作,因为键包含“。 字符,并且在这个值中也有空格。 我的属性文件总是驻留在脚本的相同目录中或/ usr / share / doc中的某个位置

现代Unix / Linux系统上的密码仍然限制在8个字符以内?

多年以前,Unix密码被限制为8个字符,或者如果您input的密码长度超过8个字符,那么额外的configuration就不会有任何区别。 大多数现代Unix / Linux系统仍然如此吗? 如果是这样,那么在大多数系统上,更长的密码何时变成可能? 有没有一种简单的方法来判断一个给定的系统是否支持更长的密码,如果是的话,有效的最大值(如果有的话)是多less? 我已经做了一些关于这个话题的networkingsearch,并且找不到任何确定的东西。 大部分出现在21世纪初的时候,我认为8个字符的限制仍然是常见的(或者普遍存在,足以保证这个限制)。

好的C库集合?

我正在为ANSI-C寻找一个好的库集合,用于处理向量的东西,哈希映射,二进制发辫,string处理等等。

“source script.sh”和“./script.sh”有什么区别?

source <script>和./<script>什么区别?

linux:获取已经运行的进程的umask?

我如何检查当前正在运行的程序的umask? [更新:另一个进程,而不是当前进程。]

什么是在不使用临时文件的情况下读取vim中的手册页的方法

我想能够阅读vim中的手册页。 由于某种原因,vim似乎无法通过pipe道读取程序的输出(即'(man ls)| vi'似乎不工作,奖励指向某人可以解释为什么),并得到在这附近,我一直在使用下面的小脚本: tempo = `mktemp` man $1 > $tempo ; vi $tempo 这个脚本使用的临时文件,我猜工作正常,但我想知道是否有一个好的方法来读取VIM的手册页,而不诉诸临时文件

ngrok如何在防火墙后面工作?

Ngrok( https://ngrok.com/ )应该允许您通过转发将本地端口和服务展示给万维网。 但是,如果我打开我的本地机器上的端口80,如下所示: ngrok 80 我回来了: Tunnel Status online Version 1.3/1.3 Forwarding http://3a4bfceb.ngrok.com -> 127.0.0.1:80 Forwarding https://3a4bfceb.ngrok.com -> 127.0.0.1:80 Web Interface http://127.0.0.1:4040 # Conn 0 Avg Conn Time 0.00ms 据我所知,任何对http://3a4bfceb.ngrok.com的请求都将通过端口80发送到本地计算机,但如果我坐在阻止传入通信的NAT /防火墙之后(这是一种非常常见的情况)。 ngrok是否会启动轮询请求以确定何时收到数据?