17

在创建bash脚本时,我发现以下代码最小二乘法将所有文件放在一行中:

pi@raspberrypi:~/ptlrestinterface$lsupdate.sh web.config MyApp.runtimeconfig.json

仍然ls|头部-n1仍然只打印第一个文件:

pi@raspberrypi:~/ptlrestinterface$ls|head-n1更新.sh

我希望它输出整行,而不是第一个文件。

通过管道输送输出时六边形突起,我看到了最小二乘法总是放一个0年然而,在控制台上的每个条目之后,它都会将它们并排放置。

显然最小二乘法对控制台(或最小二乘法). 这是如何工作的,我在哪里可以找到有关这种行为的文档?

2
  • 1
    @灰熊是我的坏蛋。关键不在于-t吨选项。这也适用于没有任何选项的情况(我更新了答案)。我的观点是|头部-n1取第一个文件名,而不是整行。 4月29日13:52
  • 尝试:ls-C|头-n 1#应该有效吗?。是|什么#它注意到stdout不是终端而是另一个命令,因此它默认为每行一个条目。ls-C型:将强制每行多个条目。 5月2日11:11

2个答案2

重置为默认值
32

它调用伊萨蒂()其上的libc函数标准输出文件描述符,用于确定输出是否发送到终端。

在内部,伊萨蒂()尝试使用ioctl()特定于tty设备的呼叫–很可能国际奥委会(TCGETS)(它检索通用tty设置stty公司命令显示);如果成功,则该文件是tty设备。

$蟒蛇>>>sys.stdout.isatty()真的

这会影响ls是否在默认情况下对其输出进行列,是否在默认情况下使用颜色,以及其他一些事情,如是否引用文件名。

如果标准输出那么,它确实是一个终端最小二乘法使用另一个特定于tty的国际奥委会(TIOCGWINSZ)检索它的尺寸(在现代系统上,终端仿真器存储在那里),以确定它可以容纳多少列。这个stty尺寸命令也会得到这些;试着把它放在下面斯特莱斯.

全屏幕程序对SIGWINCH公司每次终端仿真器更新tty的维度时,内核都会发送一个信号,表示它们需要以新的大小重新绘制所有内容。

  • 谢谢,您可能也有关于这方面的文档参考吗?手册页提到了一些关于终端格式的内容,但并没有提到当它不是终端时,它将按行输出。 4月30日9:09
  • 1
    对于Linux版本,它位于coreutils中特辛福第页 信息ls–见第3段。对于大多数BSD,它位于常规手册-C类选项和略低的-1选项。POSIX规范(作为ls(1p)手册页也包含在Linux中手动1p ls)要求“默认格式为每行列出一个条目作为标准输出;例外情况是终端或[…]” 4月30日9:49
  • 2
    FWIW,在脚本中,可以类似地调用测试-t 1查看stdout是否连接到终端。(或测试-t 0tty-秒检查相同的标准输入,尽管这可能没有那么有用) 5月1日17:11
10

要获得不太技术性的解释,请观察尝试这两个命令时会发生什么:

$1ls(美元)update.sh web.config MyApp.runtimeconfig.json$ls|猫更新.shweb.config(网络配置)我的应用.runtimeconfig.json

管道穿过“什么都不做”,除了最小二乘法“注意到”它的输出正在某处进行管道传输。因此,它会相应地改变其行为。

一旦你明白了什么最小二乘法正在输出,它通过时会发生什么很简单头部-n1.

  • 7
    没错。使用因为继电器是获得非端子特定输出的标准方法。相反更难. 4月30日6:49
  • 2
    这说明什么是的,但他们似乎已经知道了。这不能说明问题ls怎么知道按照他们的要求去做。 5月1日17:09
  • @ilkkachu是正确的,我在写了它之后注意到了这一点。但大约三分之一的观众认为它很有用(就像我在理解这一点时所做的那样),所以我就不写了。另外,op.似乎也不太确定ls输出的是什么,所以这有助于澄清这一问题。
    – 巴里
    5月1日23:28

你必须登录来回答这个问题。

不是你想要的答案吗?浏览已标记的其他问题.