【问题标题】:Encodings and process names编码和进程名称
【发布时间】:2013-07-05 11:03:51
【问题描述】:

当 shell 脚本文件编码不同时,我在进程名称中遇到了一种奇怪的、非常奇怪的行为。

场景如下:

两个文件 - caller.sh(ASCII 文本) - executor.sh(UTF-8 Unicode 文本)

# caller.sh
#!/bin/bash

/soft/executer.sh &
sleep 60

执行“caller.sh &”后,“ps”命令返回两个名为“caller.sh”的进程:

PID   TTY      TIME     CMD
19566 pts/7    00:00:00 bash
22699 pts/7    00:00:00 caller.sh
22690 pts/7    00:00:00 caller.sh
22694 pts/7    00:00:00 ps

但如果将“caller.sh”编码更改为“Bourne-Again shell script text executable”(保存在 windows 框中并传输到 linux),命令 ps 开始正确显示:

PID   TTY      TIME     CMD
19566 pts/7    00:00:00 bash
22689 pts/7    00:00:00 caller.sh
22694 pts/7    00:00:00 ps
22690 pts/7    00:00:00 executer.sh

有人能解释一下编码和进程名称/bash 之间的关系吗?

p.s:dos2unix 没有解决问题!

谢谢

【问题讨论】:

  • 不是!#/bin/bash,而是#!/bin/bash
  • 对不起,请忽略..这是一个错字
  • 如果executor.sh 是从caller.sh 调用的,它如何接收比caller.sh 更小的PID?看起来 22685 是一个自己运行的单独实例,而不是caller.sh 实例的子进程。
  • 好的,我已经手动创建了该场景,但我错误地放置了一个较小的 PID。也无视这一点。

标签: linux bash shell encoding


【解决方案1】:

我知道它发生的原因。实际上不是因为编码,而是因为注释脚本在 bash 解释器之前。

# test script
#!/bin/bash
...

我刚刚删除它,一切都开始正常显示:/

有人知道它发生的原因吗?

【讨论】:

  • 当系统 exec 是一个文件时,它会检查文件的 前两个 字节是否为“#!”,如果是,则使用以下内容作为解释器将文件作为脚本运行。如果这些字符在文件的后面,它们根本没有用。 bash 有一个后备模式,如果常规 exec 失败(在这种情况下会失败),bash 将其作为 bash 脚本运行并希望至少接近,但它并不能正常设置所有内容......
  • 请将此“答案”移至您的问题。你还在问一个问题。祝大家好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多