無標題文檔

Shell 不是 BASH,BASH 是 Shell

标题听起来像是在绕口令,不过很多兄弟都会将 BASH、CSH 和 ZSH 以及 Shell 之间的关系搞混。本人似乎又在「误人子弟」了,下面是我和 ghosTM55 兄弟 的一些聊天记录,整理如下。

ghosTM55: 自动补全是 Shell 极为有用的一项拓展功能 ,这句话有没有错?
手气不错: 应该是 BASH,Shell 是一个接口,而不是程序
ghosTM55: 好的,明白了。那么为什么有 Shell 分类这种说法呢?
手气不错: Shell 的主要功能就是封装内核和系统调用,提供统一的接口供
          用户使用。比如你编辑 /etc/passwd 更改用户默认的 shell 为
          ls,那么就显示一下当前用户目录就退出了。这是因为 ls 发送
          了 Shell 退出同样的信号(通常为 EXIT_SUCCESS)。
ghosTM55: 对
手气不错: 同时 Shell 会在幕后做很多的事情。比如你在 Shell 中输入 ls
          回车。它要做的事情首先就是在 PATH 中寻找 ls 程序。
ghosTM55: 恩
手气不错: 然后 exec() 运行 ls,等待 ls 返回,然后 shell 获得 ls 的
          退出返回值(信号),程序结束。
          这你可以看 time ls 就知道,有一个用户进程和内核进程的概念。
          大致的流程就这样,不过通常 shell 要做的事情比上述要做的事
          情要复杂得多。
ghosTM55: 那么 Shell 的种类这种讲法是不存在的?
手气不错: 这就回到上面所提到的了,shell 我个人认为是一个接口,可以有
          不同的实现(有一个叫 POSIX 标准的东西),对比 bash、csh、
          zsh 等等这些 Shell,这就像虚拟终端(Virtual Terminals)有 
          xterm、rxvt 一样。所以,引证上面的话,说终端都有半透明功能,
          这是不正确的 - 有可能就 rxvt 有这样的功能。
ghosTM55: 哦

简而言之,可以用下面的图来理解 内核 - Shell - 应用程序 - 用户 之间的的关系(图片引自 这里 )。

https://friable.rocks/_/2008_01_09/536750136.jpg

想更深入了解 Shell 机制的,可以参看 这里这里

更正:感谢寂寞烈火等兄弟的 指正 ,「应该是 BASH,Shell 是一个接口,而不是程序」这句话是 错误 的。应该是:

理论上,只要你愿意,任何一个程序都可以作为你的 Shell。- 引自 r2007 兄弟

转换字符串至 NCR

看见 PHPChina 上转帖 andot 的一篇文章《 在任意字符集下正常显示网页的方法 》,非常的受用,于是将代码粘贴到这里收藏一下。

同个页面呈现不同语言字符的编码使用 UTF-8 是目前主流的应用方案。但是在一些极端的情况下,我们不得不在某些西方字符编码的页面上显示中文。

这时候,作者非常「取巧」地想到了使用 Numeric character reference 解决这一问题。原理引述原文:

原理很简单,就是把除了 ISO-8859-1 编码中前 128 个字符以外的所
有其他的编码都用 NCR(Numeric character reference) 来表示。比如
「汉字」这两个字,如果我们写成「汉字」这种形式,
那么它在任意字符集下都可以正确显示。

下面是我做的一些无关痛痒的修改,希望作者见谅:

/**
 * nochaoscode - 转换字符串至 NCR
 *
 * @param  string $str     原字符串
 * @param  string $encode  原字符串的编码,默认 UTF-8
 * @return string 原字符串的 NCR 字符
 * @see http://en.wikipedia.org/wiki/Numeric_character_reference
 */
function nochaoscode($str, $encode = "utf-8")
{
    if (!function_exists("iconv") || !function_exists("mb_strlen")) {
        return $str;
    }

    $str = iconv($encode, "utf-16", $str); 
    for ($i = 0; $i < mb_strlen($str); $i+=2) { 
        $code = ord($str{$i}) * 256 + ord($str{$i + 1}); 
        if ($code < 128) {
            $output .= chr($code); 
        } else if ($code != 65279) {
            $output .= "&#" . $code . ";"; 
        }
    }

    return $output; 
}

原作者的 DEMO 在这里 ,但是不知道什么原因我打不开,请各位了解的告之。

正确上传文件

网站有很多地方需要交互,比方说有时候就需要用户上传文件。大部分的时候我都没有在乎这一点,我个人一向认为正确上传文件是常识。但当我整理某台服务器的时候,我发现有很多不合理的地方,于是写下来说说我的看法。这篇文件仅适合独立开 Blog,和打算珍惜服务器的每 1KB 资源的人阅读。

用户的角度上说,上传正确的文件应是自律为主。上传文件应该遵守两个原则,首先就是确定这个文件一定会使用到才会上传,其次就是是尽量的小。下面,我举例说明一下。

比如用户上传图片,jpg、gif 和 png 图片格式所能展现的效果和内容是不同的,但不建议采用上述格式以外的其他图片格式作为上传文件。 这里,有一个连接详细解释这些内容

个人 Blog 的照片如果需要插图,可以考虑使用 如 Yupoo 等图片共享网站 ,当然前提是内容符合他们的要求。这样你本身就可以每个月就可以减轻一些存储空间,并且更有利于管理。文章插图容量应该控制在 500KB 以内,大小应该控制在 800px 一下(以最宽一边计算)。根据本人的经验,这样最适合阅读。

相同的道理,如果是自己的服务器,如果没有必要,尽量不要上传视频等文件,因为这些文件将会迅速耗费你的空间。你可以将一些公共的视频放到 Youtube 等网站,这样也可以起到分流的作用。

永远不要怀疑蜘蛛的力量,文件一旦上传到服务器上,即便是没有做任何的连接,都有可能被访问到(愚蠢的服务器)。所以千万不要将你的个人资料等上传到服务器上。否则,除了会浪费服务器空间以外,还会引起不必要的麻烦。

上传的文件应该尽量避免空格、中文、全角标点符号等字符,因为服务器不一定能正确处理这些文件(虽然有点小题大作)。最好的做法是建议采用英文、数字和下划线组合而成的便于理解的文件名。

随后,下面是作为一名开发者的一些开发经验。

永远不要怀疑脚本的破坏能力, 小小的脚本可能就会毁了整台服务器 。所以避免 PHP、ASP、JSP 等这些服务器脚本上传,Windows 主机特别要注意避免用户上传可执行文件。*ix 服务器应上传操作以后立即将权限标记为 644 (目录权限为 755)。这个是第一条,而且是最总要的一条。

如果用户不是非常的在意,我们应该帮助他们重新生成上传文件的文件名。文件名应该包含文件上传日期等有规律的名称,这样在便于区分的同时也便于按照特征备份。重命名的文件明建议采用小写(这个是我的个人习惯)。

最后,建议应该适当的放松上传验证的机制。请不要误解我上句话的意思。比如上面我所说的上传的图片格式,在「逃避」了客户端的校验以后,发现用户还是上传了张 BMP 的图片,这个时候应该在适当允许的范围内,可以考虑将其转换成指定的适当格式存储,而不是「迂腐」地报错。

就是这些了,应该还有其他的一些更有用的经验,为了避免以偏概全,欢迎大家一起探讨。

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章