免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: reyleon
打印 上一主题 下一主题

[学习共享] 【大话IT】总结篇:你遇到过哪些shell陷阱? [复制链接]

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
21 [报告]
发表于 2017-04-13 10:57 |只看该作者
本帖最后由 nswcfd 于 2017-04-13 11:33 编辑

目前遇到的最诡异的:
1) { tty & tty & tty & } #三个都输出tty(符合预期)
2) ( tty & tty & tty & ) #第一个输出not a tty(【不符合预期】),另外两个是tty(符合预期)
3) ( tty & tty & tty &  wait; tty & tty & tty &) #第一个和第四个是not tty

/*    If  a  command  is  followed by a & and 【job control is not active】, the default
       standard input for the command is the empty file  /dev/null.   Otherwise,  the
       invoked command inherits the file descriptors of the calling shell as modified
       by redirections.
*/
原因是第一个tty的stdin被重定向到/dev/null (job control not active??),但是为什么另外两个没有呢!(job control active??)
三个命令的job control状态是不一样的……

PS,zsh下( ttty & tty & tty &)全部输出not a tty

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
22 [报告]
发表于 2017-04-13 11:27 |只看该作者
改造一下tty,输出更多信息。
  1. [~]# cat tty.c
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. int main()
  5. {
  6.         printf("pid=%d, ppid=%d, pgrp=%d, %stty, ttygrp=%d\n", getpid(), getppid(), getpgrp(), isatty(0)?"":"NOT ", tcgetpgrp(0));
  7.         return 0;
  8. }

  9. [~]# { echo $; ./tty; ./tty & ./tty & }; wait; ( echo $; eval echo '$'; ./tty; ./tty& ./tty & wait; ./tty & ./tty &)
  10. # { ... }
  11. 42383        # bash
  12. pid=32347, ppid=42383, pgrp=32347, tty, ttygrp=32347        # pgrp == pid, ppid == bash, fg, fg == pid
  13. [1] 32348
  14. [2] 32349
  15. pid=32348, ppid=42383, pgrp=32348, tty, ttygrp=42383        # pgrp == pid, ppid == bash, bg/1, fg == bash       
  16. [1]-  Done                    ./tty
  17. pid=32349, ppid=42383, pgrp=32349, tty, ttygrp=42383        # pgrp == pid, ppid == bash, bg/2, fg == bash
  18. [2]+  Done                    ./tty

  19. # ( ... )
  20. 42383        # $ in (...) is not subshell
  21. 42383        # ... even by eval
  22. pid=32351, ppid=32350, pgrp=32350, tty, ttygrp=32350        # pgrp != pid, pgrp == subshell, fg, fg == subshell
  23. pid=32352, ppid=32350, pgrp=32350, NOT tty, ttygrp=-1        # pgrp != pid, pgrp == subshell, bg/1, stdin == /dev/null
  24. pid=32353, ppid=32350, pgrp=32350, tty, ttygrp=32350        # pgrp != pid, pgrp == subshell, bg/2, stdin == tty, fg == subshell
  25. # wait bg/1 & bg/2
  26. [~]# pid=32354, ppid=1, pgrp=32350, NOT tty, ttygrp=-1        # pgrp != pid, pgrp == subshell, parent == init, bg/3, stdin == /dev/null
  27. pid=32355, ppid=1, pgrp=32350, tty, ttygrp=42383                # pgrp != pid, pgrp == subshell, parent == init, bg/4, stdin == tty, fg == bash
复制代码

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
23 [报告]
发表于 2017-04-13 11:28 |只看该作者
上面的$全部$$,被cu转义了

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
24 [报告]
发表于 2017-04-18 18:32 |只看该作者
这只是对语言了解的不够深入

论坛徽章:
0
25 [报告]
发表于 2017-04-19 15:17 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
26 [报告]
发表于 2017-04-21 08:09 |只看该作者
本帖最后由 799029078 于 2017-04-21 08:53 编辑

shell写的不算很多,列下遇到过的几个注意点吧
1 这个以前说过
  1.   ls  /opt/*/test  存在
  2.   sudo  ls  /opt/*/test 不存在
  3.   sudo bash  -c  "ls /opt/*/test"  存在
复制代码



2 变量加引号
比如 变量有特殊字符或者变量没定义时
  1. echo #a     输出为空
  2. echo "#a"
复制代码


3 管道符号
  1. cat file | grep xxx |awk '{[print}';echo $?
复制代码
这里的$?其实是awk是否执行成功 ,并不是cat命令执行返回的结果
  1. echo  aaa  |  exit
  2. echo "i am here"
复制代码
执行上述代码时,照样会输出 “i am here “ ,因为前面的exit只是退出了管道

4 while 和 ssh的组合的坑
  1. while read ip
  2. do
  3.   ssh $ip
  4. done < ip_list_file
复制代码
    ip_list_file 里面是ip列表,很奇怪的是只会循环一次。网上查了下资料是重定向的问题,将改写成  ssh $ip < /dev/null

5 cp  文件时会将文件属组修改成执行该命令的用户,一般需要带上-p 参数
6 登入式和非登入式shell  交互式和非交互式shell   往往会造成在命令行测试和脚本文件测试的输出不一样,比如非交互模式下,alias别名默认是关闭的。可以通过echo  $-   来进行查看具体信息

7 最后分享一个有趣的命令  ){ :& }; :   这也是偶然间看到的,就分享一下了
   这就是个fork 的实例。具体操作是通过定义一个名为 : 的函数,它会调用自己两次,一次在前台另一次运行在后台。它会反复
的执行下去直到系统崩溃。

  其实以上遇到的这些问题算是shell里一些要注意的点,结果和自己的想法会不一样,多动手,多做笔记会很实用的。








论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
27 [报告]
发表于 2017-04-24 12:38 |只看该作者
牛!学习了!

论坛徽章:
0
28 [报告]
发表于 2017-04-28 14:26 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
29 [报告]
发表于 2017-05-06 17:55 |只看该作者
1、说一个crontab里date变量结果的坑,
date +"%Y-%m-%d %T" 和 $(date +"%Y-%m-%d %T")在crontab下不起作用,需采用如下形式:
`date +"\%Y-\%m-\%d \%T"`
or
$(date +"\%Y-\%m-\%d \%T")

2、date取上个月日期坑,date +"%Y%m" -d "1 month ago":
当时间是这一月份的30日,就有问题。

[root@test ~]# date -s "2017-03-30"
Thu Mar 30 00:00:00 CST 2017
[root@test ~]# date +"%Y%m%d" -d "1 month ago"
20170302

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
30 [报告]
发表于 2017-05-07 10:58 |只看该作者
牛!学习了!支持了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP