LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 841|回复: 11

关于xinitrc有些疑问

[复制链接]
发表于 2008-8-9 12:29:54 | 显示全部楼层 |阅读模式
1)我在xinitrc里放了下面这样几句
fcitx&
urxvtd&
exec wmaker
startx后ps一下,发现fcitx的父进程是init,urxvtd的父进程是wmaker,这是怎么回事?

2)之前我的xinitrc曾今这样过
exec fcitx&
exec wmaker
我看man里面写exec后的程序要是成功运行会取代当前进程,然后exec语句之后的命令都不
会执行了,但是我这样写startx后还是能进入wmaker,不明白了

3)我想让一个程序在startx启动完wmaker后自动运行,该怎么做?不能放到xinitrc的“exec wmaker”后面吧。

4)想让一个程序在我点退出wmaker后自动运行又该怎么做?

5)以上用的是wmaker,后来我查资料说wmaker有两个脚本文件能解决3、4两个问题,我想问假如不用wmaker自带的那两个脚本,x window有啥通用的办法解决这两个问题的吗?
发表于 2008-8-9 13:35:00 | 显示全部楼层
2) 因为有一个&符号,所有为真才为真,即全部会依次成功运行或遇到一个运行失败的才会停止。
exec只要在最前面写就可以了。exec fcitx& wmaker

4) 去掉所有exec~~,可以试一下xinitrc里的程序是依次运行的,比如只写fvwm换行gnome-session,退出fvwm然后会自动进入gnome
回复 支持 反对

使用道具 举报

发表于 2008-8-9 13:56:25 | 显示全部楼层
2) 一个&是放到后台,两个&&才是逻辑与
试试这个
sh -c 'exec  ping sina.com.cn & date'

4) 补充一下,exec就是用exec的程序替代自身,替代之后exec后面的命令都和没有一样,所以一个shell脚本只有第一个exec起效
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-9 14:21:10 | 显示全部楼层
Post by zhllg;1884207
2) 一个&是放到后台,两个&&才是逻辑与
试试这个
sh -c 'exec  ping sina.com.cn & date'

4) 补充一下,exec就是用exec的程序替代自身,替代之后exec后面的命令都和没有一样,所以一个shell脚本只有第一个exec起效


先谢谢版大的回复。

关于2 我还是有疑问,exec后的命令带&放到后台,那它还替代那个sh进程吗?从运行结果来看好象没有替代,替代了的话date就不能运行了。
回复 支持 反对

使用道具 举报

发表于 2008-8-9 14:33:56 | 显示全部楼层
Post by zhllg;1884207
2) 一个&是放到后台,两个&&才是逻辑与
试试这个
sh -c 'exec  ping sina.com.cn & date'

4) 补充一下,exec就是用exec的程序替代自身,替代之后exec后面的命令都和没有一样,所以一个shell脚本只有第一个exec起效


测试了一下,真的是放到后台去了,原来如此。
回复 支持 反对

使用道具 举报

发表于 2008-8-9 14:49:58 | 显示全部楼层
原来的理解有误
请看下面第8贴的解释
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-9 15:21:05 | 显示全部楼层
咋觉的不是那样呢

  1. $ sh -c 'exec urxvt & xterm' &
  2. [1] 8102
  3. $ pstree -p $$
  4. bash(7018)─┬─pstree(8117)
  5.            └─sh(8102)─┬─urxvt(8103)───bash(8112)
  6.                       └─xterm(8104)───bash(8107)
复制代码


不是和下面这个等效嘛, 那样的话不就是说那个exec在有& 的时候没啥用
  1. $ sh -c 'urxvt & xterm' &
  2. [2] 8176
  3. $ pstree -p $$
  4. bash(7018)─┬─pstree(8191)
  5.            └─sh(8176)─┬─urxvt(8177)───bash(8186)
  6.                       └─xterm(8178)───bash(8182)
复制代码
回复 支持 反对

使用道具 举报

发表于 2008-8-9 15:56:16 | 显示全部楼层
对比一下这两个
sh -c 'exec /bin/echo & ls -ld /tmp'
sh -c 'exec /bin/echo ; ls -ld /tmp'
我猜测你的疑问在于为什么第一个例子里ls仍然得到了执行
原因是:
首先,和exec /bin/echo ; ls -ld /tmp一样,在exec /bin/echo & ls -ld /tmp里exec /bin/echo和ls也是两个命令
但不同在于,当shell在遇到&的时候,会首先开启一个子shell,然后再执行命令(exec /bin/echo),所以这里被替换的是这个子shell。然后父shell会再执行ls

你可以看看并比较一下这两个命令
sh -c 'exec ps ; ps'
sh -c 'exec ps & ps'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-9 16:41:21 | 显示全部楼层
Post by zhllg;1884245
对比一下这两个
sh -c 'exec /bin/echo & ls -ld /tmp'
sh -c 'exec /bin/echo ; ls -ld /tmp'
我猜测你的疑问在于为什么第一个例子里ls仍然得到了执行
原因是:
首先,和exec /bin/echo ; ls -ld /tmp一样,在exec /bin/echo & ls -ld /tmp里exec /bin/echo和ls也是两个命令
但不同在于,当shell在遇到&的时候,会首先开启一个子shell,然后再执行命令(exec /bin/echo),所以这里被替换的是这个子shell。然后父shell会再执行ls

你可以看看并比较一下这两个命令
sh -c 'exec ps ; ps'
sh -c 'exec ps & ps'
这里还有个不理解的,你说shell遇到&会先开一个shell再执行命令,那我之前的那个例子里命令只有(urxvt &) 那按理来说pstree的时候应该看到urxvt前面还应该有个bash就是向下面这样
  1. bash(7018)─┬─pstree(8191)
  2.            └─sh(8176)─┬─bash(xxxx)───urxvt(8177)───bash(8186)
  3.                       └─xterm(8178)───bash(8182)
复制代码

但是实际没有阿
所以我认为当有&存在时那个exec就被无视了,而不是产生一个subshell后再被exec去替换。
回复 支持 反对

使用道具 举报

发表于 2008-8-9 19:12:10 | 显示全部楼层
好,等我看看源代码,然后再来报告一下我的发现
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表