常见问题常见问题   搜索搜索   会员列表会员列表   团队团队   注册注册    个人资料个人资料   登录查看您的站内信件登录查看您的站内信件   登录登录 

《盗梦空间》与vim的共同点
前往页面 1, 2, 3  下一页
 
发表新文章   回复文章    FreeBSD China -> 休闲话题
阅读上一个主题 :: 阅读下一个主题  
作者 留言
mallocbsd
道童


注册时间: 2012-10-24
文章: 206

文章发表于: Fri 2015-12-18 10:20:28    发表主题: 《盗梦空间》与vim的共同点 引用并回复

《盗梦空间》中,主角老婆认为他们在梦中,需要跳楼才能回到现实。这是很大的赌注。

如果是在现实中,那么跳楼就是自杀;如果是在梦中,那么不跳楼就是滞留梦境。

影片中提到了判断方法:看旋转的陀螺是否停下。

----------------我是脑洞分割线----------------

用vim时可能会 :sh 开一个shell,执行一些命令后再exit返回vim,用完vim后再exit退回最初的shell。有时候会忘记自己所处的这个shell是最初的shell还是vim开的shell。

如果是在最初的shell中,那么exit就可能清理了一些环境,需要重新开shell;如果是在vim开的shell中,那么不exit就有vim进程滞留。

vim的判断方法是 .swp。

_________________
free( bsd );
返回页首
阅览会员资料 发送站内信件
alphachi
老妖


注册时间: 2007-12-10
文章: 1263
来自: @tweetxa

文章发表于: Fri 2015-12-18 11:28:18    发表主题: 引用并回复

1. 可以看下$SHLVL的值。

2. 为啥不用tmux再开个shell标签?

_________________
Paranoid in Sabbath ...
返回页首
阅览会员资料 发送站内信件
mallocbsd
道童


注册时间: 2012-10-24
文章: 206

文章发表于: Fri 2015-12-18 11:44:21    发表主题: 引用并回复

alphachi 写到:
为啥不用tmux再开个shell标签?


因为已经开了十个了,不想再开新的。

或者碰到了既没有tmux又没有screen而且还没有能力或权利安装软件的系统

_________________
free( bsd );
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Fri 2015-12-18 14:04:06    发表主题: 引用并回复

alphachi 写到:
1. 可以看下$SHLVL的值。

2. 为啥不用tmux再开个shell标签?


代码:
% procstat -b $PPID
  PID COMM                OSREL PATH
69405 vim               1100079 /Programs/vim-7.4.960/bin/vim


代码:
% ps -ax -opid,ppid,comm --libxo json | perl -MJSON::PP -le 'undef $/; $p->{$_->{pid}}=$_ for @{decode_json(<>)->{q|process-information|}->{q|process|}}; $e=$p->{$$}; while($e->{pid}) { push @r, $e->{command} . q|(| . $e->{pid} . q|)|; $e=$p->{$e->{ppid}}; }; print join(q| -> |, reverse @r);'
init(1) -> tmux(864) -> zsh(68928) -> vim(69388) -> zsh(69403) -> vim(69405) -> zsh(69406) -> perl(69408)


楼下的保持队形

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
alphachi
老妖


注册时间: 2007-12-10
文章: 1263
来自: @tweetxa

文章发表于: Fri 2015-12-18 19:20:35    发表主题: 引用并回复

anonymouscoward 写到:
alphachi 写到:
1. 可以看下$SHLVL的值。

2. 为啥不用tmux再开个shell标签?


代码:
% procstat -b $PPID
  PID COMM                OSREL PATH
69405 vim               1100079 /Programs/vim-7.4.960/bin/vim


代码:
% ps -ax -opid,ppid,comm --libxo json | perl -MJSON::PP -le 'undef $/; $p->{$_->{pid}}=$_ for @{decode_json(<q>{q|process|}}; $e=$p->{$$}; while($e->{pid}) { push @r, $e->{command} . q|(| . $e->{pid} . q|)|; $e=$p->{$e->{ppid}}; }; print join(q| -> |, reverse @r);'
init(1) -> tmux(864) -> zsh(68928) -> vim(69388) -> zsh(69403) -> vim(69405) -> zsh(69406) -> perl(69408)


楼下的保持队形

把这个骑骆驼的拉出去切了。 Twisted Evil

_________________
Paranoid in Sabbath ...
返回页首
阅览会员资料 发送站内信件
mallocbsd
道童


注册时间: 2012-10-24
文章: 206

文章发表于: Fri 2015-12-18 19:58:06    发表主题: 引用并回复

anonymouscoward 写到:

代码:
% ps -ax -opid,ppid,comm --libxo json | perl -MJSON::PP -le 'undef $/; $p->{$_->{pid}}=$_ for @{decode_json(<q>{q|process|}}; $e=$p->{$$}; while($e->{pid}) { push @r, $e->{command} . q|(| . $e->{pid} . q|)|; $e=$p->{$e->{ppid}}; }; print join(q| -> |, reverse @r);'
init(1) -> tmux(864) -> zsh(68928) -> vim(69388) -> zsh(69403) -> vim(69405) -> zsh(69406) -> perl(69408)


楼下的保持队形

好高端,我一般是用ls的。正巧在练习perl:

代码:
ps -ax -opid,ppid,comm | perl -e 'my %r; while(<STDIN>){ @r{$1}=[$2,$3] if m/(\S+)\s+(\S+)(.*)/;} sub f{ my $p=$_[0]; if($p){ f($r{$p}->[0]); print " -> $r{$p}->[1]($p)";}} f(getppid);'

_________________
free( bsd );
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Fri 2015-12-18 21:47:47    发表主题: 引用并回复

mallocbsd 写到:
好高端,我一般是用ls的。正巧在练习perl:

代码:
ps -ax -opid,ppid,comm | perl -e 'my %r; while(<STDIN>){ @r{$1}=[$2,$3] if m/(\S+)\s+(\S+)(.*)/;} sub f{ my $p=$_[0]; if($p){ f($r{$p}->[0]); print " -> $r{$p}->[1]($p)";}} f(getppid);'


模仿楼上用递归和自己手工 parse ps 输出的 ash 版:
代码:
% sh -c 'f(){ p=$1; ps -axo pid,ppid,comm -p $p | while read pid ppid comm; do case $pid in 0) echo $o ;; [0-9]*) o=" ->  $comm($pid) $o" f $ppid ;; esac done;}; f $PPID;'
-> init(1) -> tmux(864) -> zsh(74978) -> vim(78005) -> zsh(78006) -> vim(78008) -> zsh(78009)


堕落到自己手工 parse ps 输出的话,直接模仿 awk 就好了 XD
代码:
% ps -ax -opid,ppid,comm | perl -lane '$r{$F[0]}=[$F[1],$F[2]]; END{ $p=getppid; while($p) {push @o, qq|$r{$p}->[1]($p)|; $p=$r{$p}->[0]; } print join q| -> |, reverse @o }'
init(1) -> tmux(864) -> zsh(74978) -> vim(78005) -> zsh(78006) -> vim(78008) -> zsh(78009)


但这样做明显有问题,不能酱紫继续堕落下去了
其实之前的读进来的和输出的都应该用 JSON
代码:
% ps -ax -opid,ppid,comm --libxo json | perl -MJSON::PP -le 'undef $/; $p->{$_->{pid}}=$_ for @{decode_json(<>)->{q|process-information|}->{q|process|}}; $e=$p->{$$}; while($e->{pid}) { unshift @r, {$e->{command} => $e->{pid}}; $e=$p->{$e->{ppid}}; }; print encode_json(\@r);'
[{"init":"1"},{"tmux":"864"},{"zsh":"74978"},{"vim":"78005"},{"zsh":"78006"},{"vim":"78008"},{"zsh":"78009"},{"perl":"80673"}]

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
mallocbsd
道童


注册时间: 2012-10-24
文章: 206

文章发表于: Sat 2015-12-19 21:08:42    发表主题: 引用并回复

anonymouscoward 写到:
模仿楼上用递归和自己手工 parse ps 输出的 ash 版:
代码:
% sh -c 'f(){ p=$1; ps -axo pid,ppid,comm -p $p | while read pid ppid comm; do case $pid in 0) echo $o ;; [0-9]*) o=" ->  $comm($pid) $o" f $ppid ;; esac done;}; f $PPID;'
-> init(1) -> tmux(864) -> zsh(74978) -> vim(78005) -> zsh(78006) -> vim(78008) -> zsh(78009)


模仿楼上的ash写个更堕落的非递归版:
代码:
sh -c 'p=$$; ps -ax -opid,ppid,comm| sort -hr| while read pid ppid comm; do if [ $p = $pid ]; then o="-> $comm($pid) $o"; p=$ppid; if [ $p = "1" ]; then echo "init(1) $o"; fi; fi; done;'


anonymouscoward 写到:
堕落到自己手工 parse ps 输出的话,直接模仿 awk 就好了 XD

老司机真会玩,俺们刚骑骆驼的才学到正则哈希数组什么的

anonymouscoward 写到:
但这样做明显有问题,不能酱紫继续堕落下去了
其实之前的读进来的和输出的都应该用 JSON

没装 11-CURRENT的童鞋们用不了 --libxo 啊。有谁会把程序命名成tmux(3721) -> zsh(9527)或者tmux\n9527 3721 vim,然后来欺骗这些 one-liner 们呢……

----------------我是脑洞分割线----------------
Unix哲学中的“以文本为接口”是不是要升级为“以结构化的文本为接口”了啊,然后 /etc/ /usr/local/etc/ 下全改成XML什么的哈哈哈……大家也别写sh了都来写js,lua什么的,GUI就用HTML好了,搞个全屏浏览器,其它都不要了

_________________
free( bsd );
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Sat 2015-12-19 21:41:36    发表主题: 引用并回复

mallocbsd 写到:
模仿楼上的ash写个更堕落的非递归版:
代码:
sh -c 'p=$$; ps -ax -opid,ppid,comm| sort -hr| while read pid ppid comm; do if [ $p = $pid ]; then o="-> $comm($pid) $o"; p=$ppid; if [ $p = "1" ]; then echo "init(1) $o"; fi; fi; done;'


pid 可以比 ppid 小……

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
mallocbsd
道童


注册时间: 2012-10-24
文章: 206

文章发表于: Sat 2015-12-19 21:47:02    发表主题: 引用并回复

anonymouscoward 写到:
pid 可以比 ppid 小……

深表遗憾,那就不能用sort了…

是因为分配 process id 时可能会折回去用之前用过了的 pid 么,
还是可以强行把某个 pid 较小的进程的 ppid 钦定成某个 pid 较大的进程的 pid,调试完毕后再恢复?

_________________
free( bsd );


最后进行编辑的是 mallocbsd on Sun 2015-12-20 15:03:51, 总计第 2 次编辑
返回页首
阅览会员资料 发送站内信件
syh
老妖


注册时间: 2010-05-02
文章: 1617
来自: 卡拉赞

文章发表于: Sun 2015-12-20 14:06:41    发表主题: 引用并回复

看来古老的命令行工具今后都要支持有格式的输出……
_________________
又要毕业了。应该是最后一次。
-------------
audio/mous
ports-mgmt/pkg-rmleaf
Buffer Hint: http://www.vim.org/scripts/script.php?script_id=5272
返回页首
阅览会员资料 发送站内信件
mallocbsd
道童


注册时间: 2012-10-24
文章: 206

文章发表于: Sun 2015-12-20 14:35:14    发表主题: 引用并回复

Perl新手继续改作业
代码:
perl -e 'sub f{ my $p=shift; f($1) if `ps -ax -oppid -p $p` =~ m/(\d+)/; my @c=`ps -ax -ocomm -p $p`; shift @c; chomp @c; print " -> ",join("\n",@c),"($p)"; } f($$);'


syh 写到:
看来古老的命令行工具今后都要支持有格式的输出……

我现在用的 FreeBSD 10.1-RELEASE,ps(1) 还不支持 --libxo,又不想用 11-CURRENT,只好这样了:

代码:
perl -MJSON::PP -e 'my @r; sub f{ my $p=shift; f($1) if `ps -ax -oppid -p $p` =~ m/(\d+)/; my @c=`ps -ax -ocomm -p $p`; shift @c; chomp @c; push @r, {join("\n",@c) => $p}; } f($$); print encode_json \@r,"\n";'

_________________
free( bsd );


最后进行编辑的是 mallocbsd on Sun 2015-12-20 15:40:44, 总计第 6 次编辑
返回页首
阅览会员资料 发送站内信件
mallocbsd
道童


注册时间: 2012-10-24
文章: 206

文章发表于: Sun 2015-12-20 14:38:14    发表主题: 引用并回复

突然发现居然没有一个人讨论《盗梦空间》的,还以为来到了编程天地而不是休闲娱乐……
_________________
free( bsd );
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Sun 2015-12-20 15:49:43    发表主题: 引用并回复

又被你猜中了,我就是有个进程叫 z\ns\nh [5],至少人家 ps 给出的信息可是完整的
代码:
% ps -o comm -p $$ | hexdump -C
00000000  43 4f 4d 4d 41 4e 44 0a  7a 0a 73 0a 68 20 5b 35  |COMMAND.z.s.h [5|
00000010  5d 0a                                             |].|
00000012

% ps -o comm -p $$ --libxo json
{"process-information": {"process": [{"command":"z\ns\nh [5]"}]}
}


所以也不应该在我的手里丢失吧
代码:
% ps -ax -opid,ppid,comm --libxo json | perl -MJSON::PP -le 'undef $/; $p->{$_->{pid}}=$_ for @{decode_json(<>)->{q|process-information|}->{q|process|}}; $e=$p->{$$}; while($e->{pid}) { unshift @r, {$e->{command} => $e->{pid}}; $e=$p->{$e->{ppid}}; }; print encode_json(\@r);'
[{"init":"1"},{"tmux":"864"},{"zsh":"922"},{"zsh":"37912"},{"vim":"37914"},{"zsh":"37915"},{"z\ns\nh [5]":"37977"},{"perl":"38027"}]


除了 ash, 其他正常点脚本语言,不需要开脑洞也不需要取巧随手就很容易做到:
代码:
% perl -MJSON::PP -MBSD::Process -le '$p=BSD::Process::all;$e=$p->{$$}; while($e->{pid}) { unshift @r, {$e->{comm} => $e->{pid}}; $e=$p->{$e->{ppid}}; }; print encode_json(\@r);'
[{"init":1},{"tmux":864},{"zsh":922},{"zsh":37912},{"vim":37914},{"zsh":37915},{"z\ns\nh [5]":37977},{"perl":38089}]

% cat pp.py
import psutil, json

ps = {}
output = []
for p in psutil.process_iter():
        try:
                ps[p.pid] = p.as_dict()
        except (psutil.NoSuchProcess, psutil.ZombieProcess):
                pass

pid = psutil.Process().pid
while pid in ps and pid:
        output.insert(0, { ps[pid]['name'] : ps[pid]['pid'] })
        pid = ps[pid]['ppid']

print(json.dumps(output))

% python pp.py
[{"init": 1}, {"tmux": 864}, {"zsh": 922}, {"zsh": 37912}, {"vim": 37914}, {"zsh": 37915}, {"z\ns\nh [5]": 37977}, {"python2.7": 38113}]


libxo 进 base 都一年多了,越来越多的工具都开始支持用 libxo 输出
比如之前贴过的这些:
https://www.freebsdchina.org/forum/viewtopic.php?p=306972#306972
作为积极吃狗粮的粉丝用户,当然现在就开始学习咯……

虽然平时我很讨厌看到那帮不懂 shell 的前端美工的 js 脚本在服务器上乱飞,
但这确实很容易做到啊:
代码:
% ps -ax -opid,ppid,comm --libxo json | node -e 'var chunks=[];process.stdin.on("data",function(chunk){chunks.push(chunk)});process.stdin.on("end",function(){var p={},o=[],e={},proc;JSON.parse(chunks.join(""))["process-information"].process.forEach(function(e){p[e.pid]=e});proc=process.pid.toString();while(p.hasOwnProperty(proc)&&proc!=="0"){e={};e[p[proc].command]=p[proc].pid;proc=p[proc].ppid;o.unshift(e)}console.log(JSON.stringify(o))});'
[{"init":"1"},{"tmux":"864"},{"zsh":"922"},{"zsh":"37912"},{"vim":"37914"},{"zsh":"37915"},{"z\ns\nh [5]":"37977"},{"node":"38259"}]


在跟别人谈 UNIX 哲学鼓吹 shell 之前,是不是先至少贴一个能跑的 shell 脚本看看呢……

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
mallocbsd
道童


注册时间: 2012-10-24
文章: 206

文章发表于: Sun 2015-12-20 16:08:09    发表主题: 引用并回复

anonymouscoward 写到:

在跟别人谈 UNIX 哲学鼓吹 shell 之前,是不是先至少贴一个能跑的 shell 脚本看看呢……


我还有事,先走了。
不过上面帖的最后一个 Perl 脚本是能跑的并且输出的是 JSON。
shell 脚本应该比较啰嗦,虽然“原则上”是可以实现的。
另外我没有鼓吹 SHELL 啊,我说的是 --libxo 代表UNIX哲学升级新版本了……
但是既然匿懦君这么执着,我工作日有空时给一个出来好了

_________________
free( bsd );


最后进行编辑的是 mallocbsd on Sun 2015-12-20 16:17:30, 总计第 1 次编辑
返回页首
阅览会员资料 发送站内信件
syh
老妖


注册时间: 2010-05-02
文章: 1617
来自: 卡拉赞

文章发表于: Sun 2015-12-20 16:14:08    发表主题: 引用并回复

mallocbsd 写到:
突然发现居然没有一个人讨论《盗梦空间》的,还以为来到了编程天地而不是休闲娱乐……


那就切题讨论一下吧………《盗梦空间》是一部极少的我没能看得下去的电影,不知为啥。(完)

另外,推荐《神秘博士》S09E11,12,前面没看过也没关系。

_________________
又要毕业了。应该是最后一次。
-------------
audio/mous
ports-mgmt/pkg-rmleaf
Buffer Hint: http://www.vim.org/scripts/script.php?script_id=5272
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Sun 2015-12-20 22:18:44    发表主题: 引用并回复

mallocbsd 写到:
syh 写到:
看来古老的命令行工具今后都要支持有格式的输出……

我现在用的 FreeBSD 10.1-RELEASE,ps(1) 还不支持 --libxo,又不想用 11-CURRENT,只好这样了:

代码:
perl -MJSON::PP -e 'my @r; sub f{ my $p=shift; f($1) if `ps -ax -oppid -p $p` =~ m/(\d+)/; my @c=`ps -ax -ocomm -p $p`; shift @c; chomp @c; push @r, {join("\n",@c) => $p}; } f($$); print encode_json \@r,"\n";'


看到了,无限递归

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
mallocbsd
道童


注册时间: 2012-10-24
文章: 206

文章发表于: Sun 2015-12-20 23:26:14    发表主题: 引用并回复

anonymouscoward 写到:
看到了,无限递归


为什么 kernel 的 PPID 是自己而不是空的,或者-1也行嘛……还得加个 $p ne "1" 的判断

代码:
perl -MJSON::PP -e 'my @r; sub f{ my $p=shift; f($1) if $p ne "1" && `ps -ax -oppid -p $p` =~ m/(\d+)/; my @c=`ps -ax -ocomm -p $p`; shift @c; chomp @c; push @r, {join("\n",@c) => $p}; } f($$); print encode_json \@r,"\n";'

_________________
free( bsd );
返回页首
阅览会员资料 发送站内信件
mallocbsd
道童


注册时间: 2012-10-24
文章: 206

文章发表于: Sun 2015-12-20 23:37:40    发表主题: 引用并回复

syh 写到:
那就切题讨论一下吧………《盗梦空间》是一部极少的我没能看得下去的电影,不知为啥。(完)

另外,推荐《神秘博士》S09E11,12,前面没看过也没关系。


你看不下去也许是无法接受电影设立的世界观/游戏规则。

其实我也觉得这电影一般般,只不过用vim开shell时联想到了。
李奥纳多演的电影里我更喜欢禁闭岛。
现在很少看电影了

_________________
free( bsd );
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Mon 2015-12-21 01:54:36    发表主题: 引用并回复

mallocbsd 写到:
anonymouscoward 写到:
看到了,无限递归


为什么 kernel 的 PPID 是自己而不是空的,或者-1也行嘛……还得加个 $p ne "1" 的判断

代码:
perl -MJSON::PP -e 'my @r; sub f{ my $p=shift; f($1) if $p ne "1" && `ps -ax -oppid -p $p` =~ m/(\d+)/; my @c=`ps -ax -ocomm -p $p`; shift @c; chomp @c; push @r, {join("\n",@c) => $p}; } f($$); print encode_json \@r,"\n";'


就算是 1 也需要处理,比如 jail 里看不到 init
还有 JSON 的编码…… 贴张图好了:

https://ipfs.pics/ipfs/QmccoCPAYmt8cA8h47XeKPHKWhm9P6qTbSchraHus9oCu5

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
从以前的文章开始显示:   
发表新文章   回复文章    FreeBSD China -> 休闲话题 论坛时间为 北京时间
前往页面 1, 2, 3  下一页
1页/共3

 
转跳到:  
不能发布新主题
不能在这个论坛回复主题
不能在这个论坛编辑自己的文章
不能在这个论坛删除自己的文章
不能在这个论坛发表投票


Powered by phpBB 2023cc © 2003 Opensource Steps; © 2003-2009 The FreeBSD Simplified Chinese Project
Powered by phpBB © 2001, 2005 phpBB Group
Protected by Project Honey Pot and phpBB.cc
silvery-trainer
The FreeBSD China Project 网站: 中文计划网站 社区网站
The FreeBSD China Project 版权所有 (C) 1999 - 2003 网页设计版权 著作权和商标