ls的结果为什么能够自适应占满一行?

恋喵大鲤鱼
博客专家认证
2016-11-09 09:57:35
ls的结果为什么能够自适应占满一行,但是通过重定向到文件却发现每一个文件单独占一行,那为什么在屏幕上一行却显示多个文件呢?求解释,谢谢!
...全文
600 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ipqtjmqj 2016-11-10
  • 打赏
  • 举报
回复
引用 5 楼 K346K346 的回复:
[quote=引用 3 楼 yuelengdihai 的回复:] 补充下楼上的:
int isatty(int filedes);
返回值:若为终端设备则返回1(真),否则返回0(假) 标准输入就是多行,其它单行
如果说是输出到标准输出(屏幕)是多个文件占用一行,那为什么ls dir|cat 的输出结果是一个文件占用一行呢?管道命令不是将上一个命令的标准输出作为标准输入吗?按理说cat的结果也应该是多个文件占一行吧。[/quote] 管道已经不属于tty了,cat命令没有判断isatty,只是把输进来的原本输出
恋喵大鲤鱼 2016-11-10
  • 打赏
  • 举报
回复
引用 3 楼 yuelengdihai 的回复:
补充下楼上的:
int isatty(int filedes);
返回值:若为终端设备则返回1(真),否则返回0(假) 标准输入就是多行,其它单行
如果说是输出到标准输出(屏幕)是多个文件占用一行,那为什么ls dir|cat 的输出结果是一个文件占用一行呢?管道命令不是将上一个命令的标准输出作为标准输入吗?按理说cat的结果也应该是多个文件占一行吧。
ipqtjmqj 2016-11-10
  • 打赏
  • 举报
回复
引用 3 楼 yuelengdihai 的回复:
补充下楼上的:
int isatty(int filedes);
返回值:若为终端设备则返回1(真),否则返回0(假) 标准输入就是多行,其它单行
但量isatty函数的原理又是什么呢,我昨晚查了glibc的源码,也没找到isatty的实现文件,版主帮忙找找
cocoabird 2016-11-10
  • 打赏
  • 举报
回复
补充下楼上的:
int isatty(int filedes);
返回值:若为终端设备则返回1(真),否则返回0(假) 标准输入就是多行,其它单行
ipqtjmqj 2016-11-10
  • 打赏
  • 举报
回复
引用 13 楼 K346K346 的回复:
引用 1 楼 ipqtjmqj 的回复:
可以去研究一下源码
请问ls的源码哪里可以获得?
你没发现鼠标移到“源码”上会变成一个小手吗 源码的链接我是搜出来的,原来常用的工具都在一个叫coreutils的工程中
cocoabird 2016-11-10
  • 打赏
  • 举报
回复
引用 12 楼 ipqtjmqj 的回复:
[quote=引用 11 楼 yuelengdihai 的回复:] 根据头文件include路径平行向下搜索
没看懂,什么叫"平行向下", 最好举个例子[/quote] 理解错了,这个是在makefile文件中配置的,要不然怎么找
恋喵大鲤鱼 2016-11-10
  • 打赏
  • 举报
回复
引用 1 楼 ipqtjmqj 的回复:
可以去研究一下源码
请问ls的源码哪里可以获得?
ipqtjmqj 2016-11-10
  • 打赏
  • 举报
回复
引用 11 楼 yuelengdihai 的回复:
根据头文件include路径平行向下搜索
没看懂,什么叫"平行向下", 最好举个例子
cocoabird 2016-11-10
  • 打赏
  • 举报
回复
引用 10 楼 ipqtjmqj 的回复:
[quote=引用 9 楼 yuelengdihai 的回复:] fd是固定的值,不会变的。tcgetattr是根据fd获取设备信息保存到ts结构体中,这个函数我也没搜到,编译到库中了
我在code.woboq.org网站浏览源码 很奇怪,很多函数者加了下划线,而且有多处定义,比如见下图 那怎么判断实际用了哪个定义[/quote] 根据头文件include路径平行向下搜索
ipqtjmqj 2016-11-10
  • 打赏
  • 举报
回复
引用 9 楼 yuelengdihai 的回复:
fd是固定的值,不会变的。tcgetattr是根据fd获取设备信息保存到ts结构体中,这个函数我也没搜到,编译到库中了

我在code.woboq.org网站浏览源码
很奇怪,很多函数者加了下划线,而且有多处定义,比如见下图

那怎么判断实际用了哪个定义
cocoabird 2016-11-10
  • 打赏
  • 举报
回复
引用 8 楼 ipqtjmqj 的回复:
[quote=引用 7 楼 yuelengdihai 的回复:] [quote=引用 4 楼 ipqtjmqj 的回复:] [quote=引用 3 楼 yuelengdihai 的回复:] 补充下楼上的:
int isatty(int filedes);
返回值:若为终端设备则返回1(真),否则返回0(假) 标准输入就是多行,其它单行
但量isatty函数的原理又是什么呢,我昨晚查了glibc的源码,也没找到isatty的实现文件,版主帮忙找找[/quote]
#include <termios.h>
int isatty(int fd)
{
struct termios ts;
return(tcgetattr(fd,&ts) != -1);
}
调用tcgetattr获取终端信息[/quote] 那tcgetattr的原理呢 我试过,不管是否重定向,fd的值是一样的,所以变化的应该是其他标志[/quote] fd是固定的值,不会变的。tcgetattr是根据fd获取设备信息保存到ts结构体中,这个函数我也没搜到,编译到库中了
ipqtjmqj 2016-11-10
  • 打赏
  • 举报
回复
引用 7 楼 yuelengdihai 的回复:
[quote=引用 4 楼 ipqtjmqj 的回复:] [quote=引用 3 楼 yuelengdihai 的回复:] 补充下楼上的:
int isatty(int filedes);
返回值:若为终端设备则返回1(真),否则返回0(假) 标准输入就是多行,其它单行
但量isatty函数的原理又是什么呢,我昨晚查了glibc的源码,也没找到isatty的实现文件,版主帮忙找找[/quote]
#include <termios.h>
int isatty(int fd)
{
struct termios ts;
return(tcgetattr(fd,&ts) != -1);
}
调用tcgetattr获取终端信息[/quote] 那tcgetattr的原理呢 我试过,不管是否重定向,fd的值是一样的,所以变化的应该是其他标志
cocoabird 2016-11-10
  • 打赏
  • 举报
回复
引用 4 楼 ipqtjmqj 的回复:
[quote=引用 3 楼 yuelengdihai 的回复:] 补充下楼上的:
int isatty(int filedes);
返回值:若为终端设备则返回1(真),否则返回0(假) 标准输入就是多行,其它单行
但量isatty函数的原理又是什么呢,我昨晚查了glibc的源码,也没找到isatty的实现文件,版主帮忙找找[/quote]
#include <termios.h>
int isatty(int fd)
{
struct termios ts;
return(tcgetattr(fd,&ts) != -1);
}
调用tcgetattr获取终端信息
ipqtjmqj 2016-11-09
  • 打赏
  • 举报
回复

// 第1659行
 case LS_LS:
      /* This is for the 'ls' program.  */
      if (isatty (STDOUT_FILENO))
        {
          format = many_per_line;
          set_quoting_style (NULL, shell_escape_quoting_style);
          /* See description of qmark_funny_chars, above.  */
          qmark_funny_chars = true;
        }
      else
        {
          format = one_per_line;
          qmark_funny_chars = false;
        }
      break;
ipqtjmqj 2016-11-09
  • 打赏
  • 举报
回复
可以去研究一下源码

19,620

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧