深入探索国际化与Shell编程相关知识
1. 国际化介绍
国际化是一个复杂的话题,但在实践中,实际的翻译可以归结为在一个简单的文本文件中对源语言和目标语言进行简单的配对。例如:
msgid “Hello, world!”
msgstr “Bonjour tout le monde!”
在脚本运行时,像 mkdir 命令会有自己的本地化信息。比如在不同语言环境下运行脚本, mkdir 创建已存在目录时的提示信息会不同:
- 英文环境:
steve@goldie:~/script$ ./script.sh
mkdir: cannot create directory `/home/steve/.savedfiles’: File exists
- 德语环境:
steve@goldie:~/script$ export LANG=de_DE
steve@goldie:~/script$ ./script.sh
mkdir: kann Verzeichnis »/home/steve/.gespeichertendateien« nicht anlegen: Die Datei existiert bereits
- 法语环境:
steve@goldie:~/script$ LANGUAGE=fr_FR
steve@goldie:~/script$ export LANGUAGE
steve@goldie:~/script$ ./script.sh
mkdir: impossible de créer le répertoire « /home/steve/.fichiersenregistrés »: Le fichier existe
表格1:不同语言环境下 mkdir 提示信息对比
| 语言环境 | mkdir 提示信息 |
| ---- | ---- |
| 英文 | mkdir: cannot create directory /home/steve/.savedfiles’: File exists | | 德语 | mkdir: kann Verzeichnis »/home/steve/.gespeichertendateien« nicht anlegen: Die Datei existiert bereits | | 法语 | mkdir: impossible de créer le répertoire « /home/steve/.fichiersenregistrés »: Le fichier existe` |
复数形式会增加一些复杂性,脚本需要编写得使 msgid 字符串能很好地符合 gettext 和 eval_gettext 所需的简单模式,这对翻译人员来说会更方便。
2. 国际化面临的挑战及解决方案
国际化面临的一些挑战包括招募和激励翻译人员,以及在脚本中的消息发生变化时让他们重新参与更新翻译。在自由软件或开源项目中,让潜在的翻译人员对所需的工作感到舒适是留住和鼓励志愿者的重要部分。
可以采取以下措施来解决这些问题:
- 让翻译人员一次只翻译一个字符串也变得非常容易。
- 建立一个网站,让临时翻译人员可以访问,选择一种语言,查看该语言中当前未翻译的字符串,并提供他们的翻译,甚至可以不进行非常严格的身份验证或检查。如果收到一个字符串的30个提交,其中28个相关,那么除非有被欺骗的严重危险,否则很可能它们是有效的翻译,无需进一步检查。
还可以选择部分翻译。如果无法实现100%的翻译,那么可以发布带有部分翻译的脚本,这样一些消息将以母语显示,而其他消息将以英语显示,这通常比完全不支持该语言要好。
3. 相关工具和资源
3.1 Shell教程和文档
以下是一些有用的Shell教程和文档资源:
- GNU网站: http://www.gnu.org/software/bash/
- 凯斯西储大学(Cape Western Reserve University): http://tiswww.case.edu/php/chet/bash/bashtop.html
- Mendel Cooper的高级Bash脚本指南: http://bash.webofcrafts.net/abs-guide.pdf
- Andrew Arensberger的Ooblick网站: http://ooblick.com/text/sh/
- Philip Brown的Bolthole网站: http://www.bolthole.com/solaris/ksh.html
- Greg Wooledge的Bash指南: http://mywiki.wooledge.org/BashGuide
- ARNnet对Steve Bourne的采访: http://www.arnnet.com.au/article/279011/a-z_programming_languages_bourne_shell_sh/
- Dotfiles资源: http://dotfiles.org/
3.2 数组相关资源
Greg Wooledge的Bash指南中有关于bash数组的很好的信息: http://mywiki.wooledge.org/BashGuide/Arrays
3.3 复杂工具相关资源
- find : http://www.kingcomputerservices.com/unix_101/using_find_to_locate_files.htm 有一些使用
find的有用示例。 - sed :
- http://sed.sourceforge.net/sed1line.txt 是一个非常有用的参考,用于快速完成
sed的常见任务。 - http://sed.sourceforge.net/grabbag/tutorials/ 有一些推荐的教程。
- http://www.faqs.org/faqs/editor-faq/sed/
- Lev Selector的有用
sed页面: http://www.selectorweb.com/sed_tutorial.html
- http://sed.sourceforge.net/sed1line.txt 是一个非常有用的参考,用于快速完成
- awk :
- IBM DeveloperWorks网站: http://www.ibm.com/developerworks/linux/library/l-awk1/ 有一些有用的
awk信息。 - Greg Goebel的
awk入门指南: http://www.vectorsite.net/tsawk.html
- IBM DeveloperWorks网站: http://www.ibm.com/developerworks/linux/library/l-awk1/ 有一些有用的
4. Unix相关资源
Bruce Hamilton的Rosetta Stone是一个很好的资源,它涵盖了大多数主要的类Unix操作系统以及如何在每个系统中执行常见任务。可以搜索已知的内容(如 iptables )来找到其他操作系统中的等效内容(如 ipf 、 pfctl 等): http://www.bhami.com/rosetta.html
5. 壳服务(Shell Services)
壳服务有两种类型:
- 传统的壳主机允许你在他们的服务器上拥有一个账户,你可以通过 ssh 登录。
- 较新的形式,如 http://anyterm.org/ 和 http://simpleshell.com/ ,使用AJAX在浏览器和服务器上的壳之间传递文本,将壳账户变成一个网络服务。
还有一些壳服务提供商的列表:
- http://shells.red-pill.eu/
- http://www.egghelp.org/shells.htm
需要注意的是,使用他人的系统是一种特权,使用条款总是会反映这一点。不允许使用这些服务发送垃圾邮件、进行拒绝服务攻击、端口映射、破解、托管盗版软件或试图匿名等。
6. 术语表
以下是一些常见的壳编程术语解释:
| 术语 | 解释 |
| ---- | ---- |
| $ | 在壳中用于引用变量,在正则表达式中表示一行文本的结尾。 |
| | | 管道符号,用于在管道中连接命令。 |
| \ | 反斜杠,用于指示其后的字符按字面意思理解,不进行扩展。但有一些例外,如 \\ 是字面反斜杠, \n 表示换行等。 |
| #! | 哈希 - 感叹号(也称为she - bang),是文件开头的特殊字符对,指示后面的可执行文件是脚本的解释器(以及可选的参数)。 |
| & | 与符号,告诉壳前面的命令在后台执行,壳保持在前台, $! 变量设置为后台进程的PID。 |
| [ | 是 test 程序的同义词。 |
| 绝对路径 | 以斜杠字符开头,如 /etc/hosts ,无论引用进程在哪里,都表示系统上的特定文件。 |
| 别名(alias) | 命令的快捷方式,仅在交互式壳会话中有效,在壳脚本中无效。 |
| 数组(array) | 一个包含多个值的单个变量,每个值通过其索引访问。在bash 4和ksh93之前,索引必须是整数;从bash 4和ksh93开始,关联数组允许索引也可以是字符串。 |
| bash | 即Bourne Again SHell,是许多Unix和Linux操作系统上的默认壳。 |
| 内置命令(builtin) | 内置在壳中的命令,如 cd 、 declare 等。 |
| 命令替换(command substitution) | 将一个命令的输出插入到另一个命令中,有两种形式:标准形式使用反引号,新形式使用 $(cmd) 。 |
以下是命令替换的示例代码:
$ foo=`ls -l \`which grep\` /usr/bin/test`
$ echo FOO is: “$foo”
FOO is: -rwxr-xr-x 1 root root 119288 Apr 22 2010 /bin/grep
-rwxr-xr-x 1 root root 30136 Apr 28 2010 /usr/bin/test
$ bar=$(ls -l $(which grep) /usr/bin/test)
$ echo BAR is: “$bar”
BAR is: -rwxr-xr-x 1 root root 119288 Apr 22 2010 /bin/grep
-rwxr-xr-x 1 root root 30136 Apr 28 2010 /usr/bin/test
7. 文件系统和进程相关术语
| 术语 | 解释 |
|---|---|
| 编译语言(compiled language) | 写成文本文件后,由编译器解析生成二进制文件,由操作系统执行,生成的二进制文件特定于编译时的操作系统和架构。 |
| dash | Debian Almquist SHell,是Debian和其他派生发行版中的默认壳,比bash更小、更轻,但仍符合POSIX标准。 |
| 设备驱动程序(device driver) | 处理特定类设备实现细节的内核代码,通常位于 /dev 目录中,可能是磁盘或虚拟文件系统。 |
| 环境(environment) | 进程的状态,包括当前工作目录、打开的文件、子进程以及为该进程设置的环境变量。 |
| FIFO | 先进先出管道。 |
| FSF | 自由软件基金会(Free Software Foundation),由Richard M. Stallman博士创立,是GNU项目的主要赞助商。 |
| 函数(function) | 代码块,定义时不执行(但壳在解析函数时会报告发现的任何语法错误),可作为额外的命令供壳调用。 |
| GNU | GNU’s Not Unix项目,将大多数原始Unix工具重写并扩展为自由软件。 |
| 此处文档(here document) | 使用 << 语法为命令提供标准输入,主要用于为命令提供多行输入,而无需先将这些行写入文件再进行重定向。 |
| 此处字符串(here string) | 语法为 <<< ,类似于此处文档,但 <<< 右侧的文本是要执行的命令。 |
| 索引节点(inode) | 文件系统中每个文件都有一个索引节点,存储文件的关键元数据,包括文件内容的位置链接、所有者、组、权限、文件大小、链接计数、最后更改时间、修改时间和访问时间等。 |
| 解释型语言(interpreted language) | 逐行解析和执行的语言,通常也可以交互式使用,在支持该语言的任何系统上都可以执行,但系统之间的细微差异可能会增加一些复杂性,壳就是这样一种语言。 |
| 内核(kernel) | 操作系统的核心,在其他程序之前启动,完全控制硬件,包括(对于80386及更新的x86架构)将CPU切换到保护模式的独家能力,可提供抢占式多任务、中断服务和内存管理等服务。 |
| ksh | KornShell,由David Korn为AT&T的Unix编写,现在是一个开源项目,是许多GNU/Linux发行版和Unix变体的一部分。 |
| Linux | 类Unix操作系统内核,最初由Linus Torvalds开发并仍由其管理。 |
| null | NULL字节是ASCII字符零, /dev/null 被称为“比特桶”,它会丢弃发送给它的任何内容,读取时不输出任何内容; /dev/zero 提供恒定的NULL字符流。 |
| 进程(process) | 由操作系统执行的项目,每个进程都有一个进程ID(PID),在 /proc/PID 中有一个条目,包含进程的状态,如打开的文件。在壳脚本中,壳是一个进程,它在自身内部执行内置命令,外部命令(如 grep )会生成一个新进程,执行后设置一个返回码,壳通过 $? 变量获取该返回码。 |
| 重定向(redirection) | 将一个文件(最常见的是输入或输出流,如 stdin 或 stdout )的内容发送到另一个文件。 |
| 相对路径 | 不以斜杠开头,如 ../etc/hosts 指的是与当前运行进程的父目录相同的 etc 目录中的 hosts 文件, etc/hosts 指的是当前运行进程所在目录下的 etc 目录中的 hosts 文件。 |
sh | 默认系统壳,通常是Bourne壳或其他符合POSIX标准的壳,对 /bin/sh 具体功能的混淆可能会导致壳可移植性方面的重大问题。 |
| 壳(shell) | Unix和Linux系统中的默认环境、命令解释器和编程语言,是用户和内核之间的接口。 |
| 标准输入(stdin)、标准输出(stdout)、标准错误(stderr) | 所有进程启动时都有的三个文件描述符,分别是文件描述符0、1和2。 echo hello 输出到 stdout , echo error >&2 输出到 stderr 。 |
| Unix | 多用户、多任务的企业级操作系统,于1969年首次开发,至今仍广泛使用,是The Open Group的商标。 |
| 空白字符(whitespace) | 空格、制表符和换行符都被归类为空白字符,默认情况下,内部字段分隔符( $IFS )设置为这三个字符。 |
以下是此处文档和此处字符串的示例代码:
# 此处文档示例
$ cat - > /tmp/output.txt << END_IT_HERE
> hello
> this is a test.
> END_IT_HERE
$ cat /tmp/output.txt
hello
this is a test.
# 此处字符串示例
$ cat /tmp/herestring.sh
#!/bin/bash
read foo
echo Foo is $foo
read bar
echo Bar is $bar
$ /tmp/herestring.sh <<< ls
Foo is ls
Bar is
$ /tmp/herestring.sh <<< `ls /tmp`
Foo is chris.txt herestring.sh keyring-vcxP9t MozillaMailnews orbit-steve
sh-thd-1305760934 ssh-pQhaCK2245 virtual-steve.NqnWUy
Bar is
$ /tmp/herestring.sh <<< “`ls /tmp`”
Foo is chris.txt
Bar is herestring.sh
通过了解这些术语和相关资源,我们可以更好地进行壳编程和国际化相关的工作。希望这些信息对你有所帮助,在实际应用中不断探索和实践,提升自己的编程技能。
深入探索国际化与Shell编程相关知识
8. 国际化脚本的流程分析
为了更清晰地了解国际化脚本的运行流程,我们可以通过以下mermaid流程图来展示:
graph TD
A[脚本启动] --> B[设置语言环境]
B --> C{目录是否存在}
C -- 是 --> D[显示目录已存在信息]
D --> E[输出脚本其他信息]
C -- 否 --> F[创建目录]
F --> E
E --> G[结束脚本]
从这个流程图可以看出,在脚本启动后,首先会设置语言环境,然后检查目录是否存在。如果目录已存在,会根据当前语言环境显示相应的目录已存在信息,之后再输出脚本的其他信息;如果目录不存在,则会先创建目录,再输出脚本的其他信息。最后脚本结束运行。这个流程体现了国际化脚本在不同语言环境下的自适应能力。
9. 命令替换的使用场景和注意事项
命令替换在Shell编程中非常实用,它可以将一个命令的输出插入到另一个命令中。以下是一些常见的使用场景:
- 动态获取文件信息 :例如,在前面提到的命令替换示例中,通过 ls -l 命令获取文件的详细信息,然后将其插入到变量中。
$ foo=`ls -l \`which grep\` /usr/bin/test`
$ echo FOO is: “$foo”
- 自动化脚本中的动态参数 :在编写自动化脚本时,可能需要根据不同的情况动态获取参数。例如,根据当前日期生成文件名:
$ filename=$(date +%Y%m%d).log
$ touch $filename
使用命令替换时需要注意以下几点:
- 引号的使用 :为了避免输出中的空格和换行符被错误解析,通常需要使用引号将变量括起来。例如:
$ bar=$(ls -l $(which grep) /usr/bin/test)
$ echo BAR is: “$bar”
- 嵌套命令替换 :如果需要嵌套命令替换,使用反引号时需要使用反斜杠进行转义,而使用
$(cmd)形式则更加简洁。例如:
$ foo=`ls -l \`which grep\` /usr/bin/test` # 反引号嵌套需要转义
$ bar=$(ls -l $(which grep) /usr/bin/test) # $(cmd)形式更简洁
10. 壳服务的使用流程
使用壳服务时,无论是传统的壳主机还是基于AJAX的新形式,都有一定的流程。以下是一个简单的使用流程列表:
- 选择壳服务提供商 :可以从前面提到的壳服务提供商列表中选择,如 http://shells.red-pill.eu/ 或 http://www.egghelp.org/shells.htm 。
- 注册或登录 :如果是传统的壳主机,可能需要注册一个账户;对于一些新形式的壳服务,可能可以直接使用。
- 连接到壳 :
- 对于传统壳主机,使用
ssh命令连接到服务器,例如:
- 对于传统壳主机,使用
$ ssh username@server_address
- 对于基于AJAX的壳服务,打开相应的网页,按照网页提示进行操作。
- 使用壳 :在连接成功后,就可以在壳中执行各种命令,进行文件操作、编程等。
- 遵守使用条款 :在使用过程中,要遵守壳服务提供商的使用条款,不进行违规操作,如发送垃圾邮件、进行拒绝服务攻击等。
11. 总结与实践建议
通过对国际化和Shell编程相关知识的深入探索,我们了解了国际化的基本原理、面临的挑战及解决方案,掌握了各种Shell编程工具和资源,熟悉了常见的Shell编程术语和命令。以下是一些实践建议:
- 多实践 :通过编写和运行Shell脚本,加深对各种概念和命令的理解。可以从简单的脚本开始,逐渐增加复杂度。
- 参考优秀资源 :利用前面提到的各种教程和文档资源,不断学习和提升自己的技能。例如,阅读Mendel Cooper的高级Bash脚本指南,深入了解Bash脚本的高级特性。
- 参与开源项目 :参与自由软件或开源项目的国际化工作,不仅可以为项目做出贡献,还可以学习到其他开发者的经验和技巧。
- 注意代码规范 :在编写Shell脚本时,要注意代码的规范性和可读性,使用适当的注释和缩进,方便自己和他人维护代码。
通过不断地学习和实践,我们可以更好地掌握国际化和Shell编程技术,为开发出更优秀的软件打下坚实的基础。
超级会员免费看
438

被折叠的 条评论
为什么被折叠?



