Blog

协程(coproc)

Content #

协程同时做两件事:一是在后台生成一个子shell,二是在该子shell中执行命令。要进行协程处理,可以结合使用coproc命令以及要在子shell中执行的命令:

$ coproc sleep 10
[1] 2689

除了会创建子shell,协程基本上就是将命令置入后台。当输入coproc命令及其参数之后,你会发现后台启用了一个作业。屏幕上会显示该后台作业号(1)以及进程ID(2689)。

$ jobs
[1]+  Running                  coproc COPROC sleep 10 &

从上面的例子中可以看到,在子shell中执行的后台命令是coproc COPROC sleep 10。COPROC是coproc命令给进程起的名字。可以使用命令的扩展语法来自己设置这个名字:

$ coproc My_Job { sleep 10; }
[1] 2706
$ jobs
[1]+ Running                   coproc My_Job { sleep 10; } &

使用扩展语法,协程名被设置成了My_Job。这里要注意,扩展语法写起来有点儿小麻烦。你必须确保在左花括号({)和内部命令名之间有一个空格。还必须保证内部命令以分号(;)结尾。另外,分号和右花括号(})之间也得有一个空格。

协程能够让你尽情地发挥想象力,发送或接收来自子shell中进程的信息。只有在拥有多个协程时才需要对协程进行命名,因为你要和它们进行通信。否则的话,让coproc命令将其设置成默认名称COPROC即可。

你可以发挥才智,将协程与进程列表结合起来创建嵌套子shell。只需将命令 coproc放在进程列表之前即可:

$ coproc ( sleep 10; sleep 2 )
[1] 2750
$
$ jobs
[1]+  Running                  coproc COPROC ( sleep 10; sleep 2 ) &
$
$ ps --forest
  PID TTY          TIME CMD
 2367 pts/0    00:00:00 bash
 2750 pts/0    00:00:00  \_ bash
 2751 pts/0    00:00:00  |   \_ sleep
 2752 pts/0    00:00:00  \_ ps

From #

Linux命令行与shell脚本编程大全

...

利用后台进程列表创建备份文件

Content #

通过将进程列表置入后台,可以在子shell中进行大量的多进程处理。由此带来的一个好处是终端不再和子shell的I/O绑定在一起。

使用tar创建备份文件是有效利用后台进程列表的一个更实用的例子:

$ (tar -cf Doc.tar Documents ; tar -cf Music.tar Music)&

From #

Linux命令行与shell脚本编程大全

命令分组(command grouping)

jobs命令

Content #

可以使用jobs命令来显示后台作业信息。jobs命令能够显示当前运行在后台模式中属于你的所有进程(作业):

$ jobs
[1]+  Running                 sleep 3000 &

jobs命令会在方括号中显示作业号(1)。除此之外,还有作业的当前状态(Running)以及对应的命令(sleep 3000 &)。

利用jobs命令的 -l(小写字母l)选项,还可以看到更多的相关信息。除了默认信息,-l选项还会显示命令的PID。

$ jobs -l
[1]+  2542 Running                 sleep 3000 &

如果运行多个后台进程,则还有一些额外信息可以显示哪个后台作业是最近启动的。在jobs命令的显示中,最近启动的作业在其作业号之后会有一个加号(+),在它之前启动的进程(the second newest process)则以减号(-)表示。

一旦后台作业完成,就会显示出结束状态:

$
[1]+  Done                         sleep 3000

From #

Linux命令行与shell脚本编程大全

判断是否生成了子shell

Content #

echo $BASH_SUBSHELL

如果该命令返回0,那么表明没有子shell。如果该命令返回1或者其他更大的数字,则表明存在子shell。

下面这个例子先后使用了命令列表和echo $BASH_SUBSHELL:

$ pwd ; ls test* ; cd /etc ; pwd ; cd ; pwd ; ls my* ; echo $BASH_SUBSHELL
/home/christine
test_file  test_one  test_two
/etc
/home/christine
my_file  my_scrapt  my_script  my_scrypt
0

在输出结果的最后是数字0。这表明并未创建子shell来执行这些命令。

如果改用进程列表,则结果就不一样了。

$ (pwd ; ls test* ; cd /etc ; pwd ; cd ; pwd ; ls my* ; echo $BASH_SUBSHELL)
/home/christine
test_file  test_one  test_two
/etc
/home/christine
my_file  my_scrapt  my_script  my_scrypt
1

这次在输出结果的最后是数字1。这表明的确创建了子shell来执行这些命令。

...

命令分组(command grouping)

Content #

  1. 将命令放入圆括号圆括号的使用让命令列表摇身变成了进程列表,生成了一个子shell来执行这些命令。
  2. 将命令放入花括号内,并在命令列表尾部以分号(;)作结。语法为:{ command; } 使用花括号进行命令分组并不会像进程列表那样创建子shell。

From #

Linux命令行与shell脚本编程大全

通过欣赏高雅艺术来炫耀自己

Content #

就在我们刚刚搬进的大楼几十米之外的地方,人们正在建造一个罗马风格的小教堂,教堂是藤田嗣治设计的,为了庆祝他几年前突然在兰斯的圣·雷米大教堂改信基督教,他还会在教堂里画上壁画。我是很久之后才明白,我们家对艺术没什么兴趣,对基督教艺术更是如此。我是在写这本书的时候才第一次走进这座教堂。

对于艺术的品味需要学习。我学习了。这是自我再教育的一部分,这种自我再教育几乎就是完全改变自己,只有完成它,我才能进入另外一个世界、另外一个社会阶级——才能远离我过去的一切。无论人们有意识或无意识,对于艺术作品的喜好或者对一切文学艺术的喜好总是会让一个人显得更高级,这种高级是通过与那些没有机会接触艺术品的人相比较而实现的。艺术爱好者的这种“高级”,指与其他人在自我构成上的差别,指人们对自己的眼光与对其他人(那些“没文化”的、“低等”阶级的人)眼光的迥异。在我后来作为“文化人”的生活中,当我参观一个展览,或是听一场音乐会,或是观看一场歌剧表演时,有无数次,我观察到那些热衷于“高雅”文化活动的人们从这些行为中获得了如此多的自我满足感和优越感,这种满足感和优越感展现于他们永远不会放下的神秘微笑,还有他们克制的肢体动作,还有他们作为艺术行家以及有钱人的讲话方式……所有这些都表达了一种对于自身社会身份的愉悦感,他们属于优越的阶级,他们可以通过欣赏“高雅”艺术来炫耀自己。这样的场景总是让我觉得惊恐,然而我依旧努力让自己变得和他们更加相像,让自己看起来出生于这样的阶级,努力像他们一样,在欣赏艺术的场合表现出轻松自如的神态。

From #

回归故里

统治阶级意识不到自己属于某个特定群体

Content #

当我们还是只是工人阶级家庭的孩子时,就打心眼里明白自己的阶级归属。我在写关于保守革命(révolution conservatrice)的书时,曾经在图书馆借阅雷蒙·阿隆(Reymond Aron)的几本书,因为1980年代和1990年代的那批试图用左翼思想占领法国思想界的思想家们是推崇雷蒙·阿隆的(这种推崇倒是十分有理有据)。在阅读这位肤浅而喜欢说教的教授所作的几篇毫无层次和亮点的文章时,我看到了这句话:“如果我努力回忆自己在学习社会学之前是否产生了‘阶级意识’,我几乎回忆不起来,而这并不是因为年代久远导致的记忆模糊;换句话说,我不认为现代社会的每一个成员都一定认为自己从属于社会之中某个既定的,被称为阶级的群体。社会阶层无疑客观存在,但阶级成员的阶级意识并不一定存在。”

我认为资产阶级出身的儿童缺乏阶级归属意识是可能的。统治阶级意识不到自己属于某个特定群体(就如同白人不能意识到自己属于白人群体,异性恋不能意识到自己属于异性恋群体)。因而,这段评论也展示出它的真实面貌:属于特权阶级的作者天真地承认自己在接触社会学之前没有阶级意识,而这件事本身恰恰展示了他的社会身份。我只见过这位人物一面,见到他后我立刻觉得反感。我讨厌他虚伪的笑容和柔和的声音,他用这种方式展示着自己的沉着、理性,但归根结底无非是展示着他作为资产阶级所拥有的丰厚的物质条件和成熟稳重的思维方式。

From #

回归故里

不同社会空间之间有一层几乎不可逾越的障碍

Content #

当时,父亲做工人(最低级的工人)已经很久了。当他初入这一行当时,只有14 岁(7月末学校课程结束时,他立刻开始工作,当时他还差3个月才满14岁)。这一工人身份构成了他的人生底色,也是他的视野所能触及的唯一领域。工厂就是他的归宿,父亲也别无他念,一切都显得自然而然,随后,他的兄弟姐妹们也都陆续进入工厂。对于那些社会地位与父亲一样的孩子,情况总是如此,过去是这样,现在也是这样。自从他出生,这种社会模式就一直支配着他。这种我们只能称之为“再生产(reproduction)”的社会运行机制与定律让父亲无处遁形。

父亲在接受完初等教育之后就结束了学业。再者,没有人认为他可以继续学习,他的父母这样认为,他自己也这样认为。在他的生活环境中,人们只上学到14岁,因为14岁之前接受的是义务教育,之后就不是了。情况就是如此。离开学校并不算什么丑事,相反,我记得,当义务教育的规定年龄延至16岁时,我的家人非常愤怒,并重复道:“如果孩子们不喜欢上学而是想工作,干吗还把他们捆在学校里?”他们从来没想过,对于学习是否有“兴趣”这件事可以因人而异。学校淘汰学生往往会通过学生的主动放弃来实现,仿佛学生辍学是一种自主的选择——长期读书这个选择属于别人,也就是“有办法的人”,还有“喜欢”读书的人。他们拥有的可能性——这里说的是可以想象的可能性,甚至不是实际的可能性——被他们的阶级地位严格限定着。

仿佛不同社会空间之间有一层几乎不可逾越的障碍。这些界限将社会分为不同层次,每个层次中的人对于自己可能达到的高度以及可以追求的目标有着截然不同的想象:他们知道,有另外一种可能性的存在,但那存在于一个无法靠近的、遥远的世界,所以即使他们知道自己无法获得某种被其他社会空间中的人视作理所应当的东西,他们也不会有被剥夺和被排斥的感受。社会秩序就是如此。

我们很难发现这套秩序是如何运行的,因为这需要人们从外部观看自己,用俯瞰的方式了解自己和他人的生活。就像我所经历的那样,我们需要从界限的一边跨越到另一边,来摆脱那些既定的轨迹,来发现不同的人所拥有的可能性与机会是如此不同,来发现社会是多么不公平。这种不公从未改变:平民阶级在特定年龄辍学的问题已经不存在了,但不同阶级之间的屏障依旧存在。这也就是为什么所有把“行动主体的观点”和“行动主体对于自身行为意义的解读”作为自己研究出发点的社会学家和哲学家,其实就是充当了某种具有欺骗性的社会关系(社会主体在自身欲望的驱使下通过具体行动维系着这种关系)的速记员,因此,他们无非是在为社会秩序的延续做着贡献:一种致力于为现实(既有的秩序)辩护的意识形态。

只有摒弃“社会个体会自动地审视自身”这种认识,我们才能在重新建构整个社会体系的基础上,描述社会秩序延续的机制,尤其是被压迫者自愿承受压迫的方式(对于他们无法获得的教育机会,他们选择主动放弃)。一种理论的力度和价值,恰恰在于它不满足于记录行为主体行动的目的,而是相反地,致力于让某些个体或者群体通过完全不同于以往的方式看待自己和自己的行为,进而改变他们行事的方式和身份。我们需要摆脱认知中深藏已久的等级观念,以及概念架构的条条框框,进而摆脱这些等级观念和条条框框所造就的社会惯性,才能拥有新的世界观和政治观念。

From #

回归故里

孤独的排头兵

Content #

拉康在一次他的“讲座”(Séminaire)中说得极好,他说,父亲去世之后,下一代(至少是儿子)会感受到一种焦虑:在通往死亡的道路上,他成了孤独的排头兵。

From #

回归故里