标签 Shell 下的文章

问题: 我经常在命令行中切换 shell。是否有一个快速简便的方法来找出我当前正在使用的 shell 呢?此外,我怎么能找到当前 shell 的版本?

找到你当前正在使用的 Shell 版本

有多种方式可以查看你目前在使用什么 shell,最简单的方法就是通过使用 shell 的特殊参数。

其一,一个名为 "$$" 的特殊参数 表示当前你正在运行的 shell 实例的 PID。此参数是只读的,不能被修改。所以,下面的命令也将显示你正在运行的 shell 的名字:

$ ps -p $$

  PID TTY          TIME CMD
21666 pts/4    00:00:00 bash

上述命令可在所有可用的 shell 中工作。

如果你不使用 csh,找到当前使用的 shell 的另外一个办法是使用特殊参数 “$0” ,它表示当前正在运行的 shell 或 shell 脚本的名称。这是 Bash 的一个特殊参数,但也可用在其他 shell 中,如 sh、zsh、tcsh 或 dash。使用 echo 命令可以查看你目前正在使用的 shell 的名称。

$ echo $0

bash

不要被一个叫做 $SHELL 的单独的环境变量所迷惑,它被设置为你的默认 shell 的完整路径。因此,这个变量并不一定指向你当前使用的 shell。例如,即使你在终端中调用不同的 shell,$SHELL 也保持不变。

$ echo $SHELL

/bin/shell

因此,找出当前的shell,你应该使用 $$ 或 $0,但不是 $SHELL。

找出当前 Shell 的版本

一旦你知道你使用的是哪个 shell,你可能想知道此 shell 的版本。为此,在命令行中输入 shell 并在后面加上 “--version” 参数可以查看版本信息。例如:

对于 bash shell :

$ bash --version

GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

对于 zsh shell:

$ zsh --version

zsh 5.0.7 (x86_64-pc-linux-gnu)

对于 tcsh shell: $ tcsh --version

tcsh 6.18.01 (Astron) 2012-02-14 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,nd,color,filec

对于某些 shell,你还可以使用 shell 特定的变量(例如,$BASH*VERSION 或 $ZSH*VERSION)。

$ echo $BASH_VERSION

4.3.8(1)-release

via: http://ask.xmodulo.com/which-shell-am-i-using.html

作者:Dan Nanni 译者:strugglingyouth 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

当你双击一个脚本(.sh文件)的时候,你想要做的是什么?通常的想法是执行它。但是在Ubuntu下面却不是这样,或者我应该更确切地说是在Files(Nautilus)中。你可能会疯狂地大叫“运行文件,运行文件”,但是文件没有运行而是用Gedit打开了。

我知道你也许会说文件有可执行权限么?我会说是的。脚本有可执行权限但是当我双击它的时候,它还是用文本编辑器打开了。我不希望这样,如果你遇到了同样的问题,我想你也许也想要这样。

我知道你或许已经被建议在终端下面执行,我知道这个可行,但是这不是一个在GUI下不能运行的借口是么?

这篇教程中,我们会看到如何在双击后运行shell脚本。

修复在Ubuntu中shell脚本用文本编辑器打开的方式

shell脚本用文件编辑器打开的原因是Files(Ubuntu中的文件管理器)中的默认行为设置。在更早的版本中,它或许会询问你是否运行文件或者用编辑器打开。默认的行为在新的版本中被修改了。

要修复这个,进入文件管理器,并在菜单中点击选项

接下来在 文件选项 Files Preferences 中进入 行为 Behavior 标签中,你会看到 可执行的文本文件 Executable Text Files 选项。

默认情况下,它被设置成“ 在打开时显示文本文件 View executable text files when they are opend ”。我建议你把它改成“ 每次询问 Ask each time ”,这样你可以选择是执行还是编辑了,当然了你也可以选择“ 在打开时云可执行文本文件 Run executable text files when they are opend ”。你可以自行选择。

我希望这个贴士可以帮你修复这个小“问题”。欢迎提出问题和建议。


via: http://itsfoss.com/shell-script-opens-text-editor/

作者:Abhishek 译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

FISH(friendly interactive shell)是一个用户友好的命令行 shell,主要是用来进行交互式使用。shell 就是一个用来执行其他程序的程序。

FISH 特性

自动建议

fish 会根据你的历史输入和补完来提供命令建议,就像一个网络浏览器一样。注意了,就是Netscape Navigator 4.0!

漂亮的VGA 色彩

fish 原生支持 term256, 它就是一个终端技术的艺术国度。 你将可以拥有一个难以置信的、256 色的shell 来使用。

理智的脚本

fish 是完全可以通过脚本控制的,而且它的语法又是那么的简单、干净,而且一致。你甚至不需要去重写。

基于 web 的配置

对于少数能使用图形计算机的幸运儿, 你们可以在网页上配置你们自己的色彩方案,以及查看函数、变量和历史记录。

帮助手册补全

其它的 shell 支持可配置的补全, 但是只有 fish 可以通过自动转换你安装好的 man 手册来实现补全功能。

开箱即用

fish 将会通过 tab 补全和语法高亮使你非常愉快的使用shell, 同时不需要太多的学习或者配置。

在ubuntu 15.04 上安装FISH

打开终端,运行下列命令:

sudo apt-add-repository ppa:fish-shell/release-2
sudo apt-get update
sudo apt-get install fish

使用FISH

打开终端,运行下列命令来启动FISH:

fish

欢迎来到 fish,友好的交互式shell,输入指令 help 来了解怎么使用fish。

阅读FISH 文档 ,掌握使用方法。


via: http://www.ubuntugeek.com/fish-a-smart-and-user-friendly-command-line-shell-for-linux.html

作者:ruchi 译者:oska874 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我们在Linux上工作时,每个人都会遇到需要查找shell命令的帮助信息的时候。 尽管内置的帮助像man pages、whatis命令有所助益, 但man pages的输出非常冗长, 除非是个有linux经验的人,不然从大量的man pages中获取帮助信息是非常困难的,而whatis命令的输出很少超过一行, 这对初学者来说是不够的。

Explain Shell Commands in Linux Shell

在Linux Shell中解释Shell命令

有一些第三方应用程序, 像我们在Linux 用户的命令行速查表提及过的'cheat'命令。cheat是个优秀的应用程序,即使计算机没有联网也能提供shell命令的帮助, 但是它仅限于预先定义好的命令。

Jackson写了一小段代码,它能非常有效地在bash shell里面解释shell命令,可能最美之处就是你不需要安装第三方包了。他把包含这段代码的的文件命名为“explain.sh”。

explain.sh工具的特性

  • 易嵌入代码。
  • 不需要安装第三方工具。
  • 在解释过程中输出恰到好处的信息。
  • 需要网络连接才能工作。
  • 纯命令行工具。
  • 可以解释bash shell里面的大部分shell命令。
  • 无需使用root账户。

先决条件

唯一的条件就是'curl'包了。 在如今大多数Linux发行版里面已经预安装了curl包, 如果没有你可以按照下面的命令来安装。

# apt-get install curl  [On Debian systems]
# yum install curl      [On CentOS systems]

在Linux上安装explain.sh工具

我们要将下面这段代码插入'~/.bashrc'文件(LCTT译注: 若没有该文件可以自己新建一个)中。我们要为每个用户以及对应的'.bashrc'文件插入这段代码,但是建议你不要加在root用户下。

我们注意到.bashrc文件的第一行代码以(#)开始, 这个是可选的并且只是为了区分余下的代码。

explain.sh 标记代码的开始, 我们将代码插入.bashrc文件的底部。(备注:原代码有误,处理 https 时需要指定加密套件,据微信网友“高小树”同学的改进,原来的-Gs应该修改为-G --ciphers ecdhe_ecdsa_aes_128_sha。谢谢“高小树”同学。)

# explain.sh begins
explain () {
  if [ "$#" -eq 0 ]; then
    while read  -p "Command: " cmd; do
      curl -G --ciphers ecdhe_ecdsa_aes_128_sha "https://www.mankier.com/api/explain/?cols="$(tput cols) --data-urlencode "q=$cmd"
    done
    echo "Bye!"
  elif [ "$#" -eq 1 ]; then
    curl -G --ciphers ecdhe_ecdsa_aes_128_sha "https://www.mankier.com/api/explain/?cols="$(tput cols) --data-urlencode "q=$1"
  else
    echo "Usage"
    echo "explain                  interactive mode."
    echo "explain 'cmd -o | ...'   one quoted command to explain it."
  fi
}

explain.sh工具的使用

在插入代码并保存之后,你必须退出当前的会话然后重新登录来使改变生效(LCTT译注:你也可以直接使用命令source ~/.bashrc 来让改变生效)。每件事情都是交由‘curl’命令处理, 它负责将需要解释的命令以及命令选项传送给mankier服务,然后将必要的信息打印到Linux命令行。不必说的就是使用这个工具你总是需要连接网络。

让我们用explain.sh脚本测试几个笔者不懂的命令例子。

1.我忘了‘du -h’是干嘛用的, 我只需要这样做:

$ explain 'du -h'

Get Help on du Command

获得du命令的帮助

2.如果你忘了'tar -zxvf'的作用,你可以简单地如此做:

$ explain 'tar -zxvf'

Tar Command Help

Tar命令帮助

3.我的一个朋友经常对'whatis'以及'whereis'命令的使用感到困惑,所以我建议他:

在终端简单的地敲下explain命令进入交互模式。

$ explain

然后一个接着一个地输入命令,就能在一个窗口看到他们各自的作用:

Command: whatis
Command: whereis

Whatis Whereis Commands Help

Whatis/Whereis命令的帮助

你只需要使用“Ctrl+c”就能退出交互模式。

4. 你可以通过管道来请求解释更多的命令。

$ explain 'ls -l | grep -i Desktop'

Get Help on Multiple Commands

获取多条命令的帮助

同样地,你可以请求你的shell来解释任何shell命令。 前提是你需要一个可用的网络。输出的信息是基于需要解释的命令,从服务器中生成的,因此输出的结果是不可定制的。

对于我来说这个工具真的很有用,并且它已经荣幸地添加在我的.bashrc文件中。你对这个项目有什么想法?它对你有用么?它的解释令你满意吗?请让我知道吧!

请在下面评论为我们提供宝贵意见,喜欢并分享我们以及帮助我们得到传播。


via: http://www.tecmint.com/explain-shell-commands-in-the-linux-shell/

作者:Avishek Kumar 译者:dingdongnigetou 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

在我们的关于 shell 基础的指导下, 得到一个更灵活,功能更强大且多彩的命令行界面

为何要这样做?

  • 使得在 shell 提示符下过得更轻松,高效
  • 在失去连接后恢复先前的会话
  • Stop pushing around that fiddly rodent!

bash1

这是我的命令行提示符的设置。对于这个小的终端窗口来说,这或许有些长。但你可以根据你的喜好来调整它。

作为一个 Linux 用户, 你可能熟悉 shell (又名为命令行)。 或许你需要时不时的打开终端来完成那些不能在 GUI 下处理的必要任务,抑或是因为你处在一个将窗口铺满桌面的环境中,而 shell 是你与你的 linux 机器交互的主要方式。

在上面那些情况下,你可能正在使用你所使用的发行版本自带的 Bash 配置。 尽管对于大多数的任务而言,它足够好了,但它可以更加强大。 在本教程中,我们将向你展示如何使得你的 shell 提供更多有用信息、更加实用且更适合工作。 我们将对提示符进行自定义,让它比默认情况下提供更好的反馈,并向你展示如何使用炫酷的 tmux 工具来管理会话并同时运行多个程序。 并且,为了让眼睛舒服一点,我们还将关注配色方案。那么,进击吧,少女!

让提示符更美妙

大多数的发行版本配置有一个非常简单的提示符,它们大多向你展示了一些基本信息, 但提示符可以为你提供更多的内容。例如,在 Debian 7 下,默认的提示符是这样的:

mike@somebox:~$

上面的提示符展示出了用户、主机名、当前目录和账户类型符号(假如你切换到 root 账户, $ 会变为 #)。 那这些信息是在哪里存储的呢? 答案是:在 PS1 环境变量中。 假如你键入 echo $PS1, 你将会在这个命令的输出字符串的最后有如下的字符:

\u@\h:\w$

这看起来有一些丑陋,并在瞥见它的第一眼时,你可能会开始尖叫,认为它是令人恐惧的正则表达式,但我们不打算用这些复杂的字符来煎熬我们的大脑。这不是正则表达式,这里的斜杠是转义序列,它告诉提示符进行一些特别的处理。 例如,上面的 u 部分,告诉提示符展示用户名, 而 w 则展示工作路径.

下面是一些你可以在提示符中用到的字符的列表:

  • d 当前的日期
  • h 主机名
  • n 代表换行的字符
  • A 当前的时间 (HH:MM)
  • u 当前的用户
  • w (小写) 整个工作路径的全称
  • W (大写) 工作路径的简短名称
  • $ 一个提示符号,对于 root 用户为 # 号
  • ! 当前命令在 shell 历史记录中的序号

下面解释 wW 选项的区别: 对于前者,你将看到你所在的工作路径的完整地址,(例如 /usr/local/bin),而对于后者, 它则只显示 bin 这一部分。

现在,我们该怎样改变提示符呢? 你需要更改 PS1 环境变量的内容,试试下面这个:

export PS1="I am \u and it is \A $"

现在,你的提示符将会像下面这样:

I am mike and it is 11:26 $

从这个例子出发,你就可以按照你的想法来试验一下上面列出的其他转义序列。 但等等 – 当你登出后,你的这些努力都将消失,因为在你每次打开终端时,PS1 环境变量的值都会被重置。解决这个问题的最简单方式是打开 .bashrc 配置文件(在你的家目录下) 并在这个文件的最下方添加上完整的 export 命令。在每次你启动一个新的 shell 会话时,这个 .bashrc 会被 Bash 读取, 所以你的加强的提示符就可以一直出现。你还可以使用额外的颜色来装扮提示符。刚开始,这将有点棘手,因为你必须使用一些相当奇怪的转义序列,但结果是非常漂亮的。 将下面的字符添加到你的 PS1字符串中的某个位置,最终这将把文本变为红色:

\[\e[31m\]

你可以将这里的 31 更改为其他的数字来获得不同的颜色:

  • 30 黑色
  • 32 绿色
  • 33 黄色
  • 34 蓝色
  • 35 洋红色
  • 36 青色
  • 37 白色

所以,让我们使用先前看到的转义序列和颜色来创造一个提示符,以此来结束这一小节的内容。深吸一口气,弯曲你的手指,然后键入下面这只“野兽”:

export PS1="(\!) \[\e[31m\] \[\A\] \[\e[32m\]\u@\h \[\e[34m\]\w \[\e[30m\]$"

上面的命令提供了一个 Bash 命令历史序号、当前的时间、彩色的用户或主机名组合、以及工作路径。假如你“野心勃勃”,利用一些惊人的组合,你还可以更改提示符的背景色和前景色。非常有用的 Arch wiki 有一个关于颜色代码的完整列表:http://tinyurl.com/3gvz4ec

Shell 精要

假如你是一个彻底的 Linux 新手并第一次阅读这份杂志,或许你会发觉阅读这些教程有些吃力。 所以这里有一些基础知识来让你熟悉一些 shell。 通常在你的菜单中, shell 指的是 Terminal、 XTerm 或 Konsole, 当你启动它后, 最为实用的命令有这些:

ls (列出文件名); cp one.txt two.txt (复制文件); rm file.txt (移除文件); mv old.txt new.txt (移动或重命名文件);

cd /some/directory (改变目录); cd .. (回到上级目录); ./program (在当前目录下运行一个程序); ls > list.txt (重定向输出到一个文件)。

几乎每个命令都有一个手册页用来解释其选项(例如 man ls – 按 Q 来退出)。在那里,你可以知晓命令的选项,这样你就知道 ls -la 展示一个详细的列表,其中也列出了隐藏文件, 并且在键入一个文件或目录的名字的一部分后, 可以使用 Tab 键来自动补全。

Tmux: 针对 shell 的窗口管理器

在文本模式的环境中使用一个窗口管理器 – 这听起来有点不可思议, 是吧? 然而,你应该记得当 Web 浏览器第一次实现分页浏览的时候吧? 在当时, 这是在可用性上的一个重大进步,它减少了桌面任务栏的杂乱无章和繁多的窗口列表。 对于你的浏览器来说,你只需要一个按钮便可以在浏览器中切换到你打开的每个单独网站, 而不是针对每个网站都有一个任务栏或导航图标。 这个功能非常有意义。

若有时你同时运行着几个虚拟终端,你便会遇到相似的情况; 在这些终端之间跳转,或每次在任务栏或窗口列表中找到你所需要的那一个终端,都可能会让你觉得麻烦。 拥有一个文本模式的窗口管理器不仅可以让你像在同一个终端窗口中运行多个 shell 会话,而且你甚至还可以将这些窗口排列在一起。

另外,这样还有另一个好处:可以将这些窗口进行分离和重新连接。想要看看这是如何运行的最好方式是自己尝试一下。在一个终端窗口中,输入 screen (在大多数发行版本中,它已经默认安装了或者可以在软件包仓库中找到)。 某些欢迎的文字将会出现 – 只需敲击 Enter 键这些文字就会消失。 现在运行一个交互式的文本模式的程序,例如 nano, 并关闭这个终端窗口。

在一个正常的 shell 对话中, 关闭窗口将会终止所有在该终端中运行的进程 – 所以刚才的 Nano 编辑对话也就被终止了, 但对于 screen 来说,并不是这样的。打开一个新的终端并输入如下命令:

screen -r

瞧,你刚开打开的 Nano 会话又回来了!

当刚才你运行 screen 时, 它会创建了一个新的独立的 shell 会话, 它不与某个特定的终端窗口绑定在一起,所以可以在后面被分离并重新连接(即 -r 选项)。

当你正使用 SSH 去连接另一台机器并做着某些工作时, 但并不想因为一个脆弱的连接而影响你的进度,这个方法尤其有用。假如你在一个 screen 会话中做着某些工作,并且你的连接突然中断了(或者你的笔记本没电了,又或者你的电脑报废了——不是这么悲催吧),你只需重新连接或给电脑充电或重新买一台电脑,接着运行 screen -r 来重新连接到远程的电脑,并在刚才掉线的地方接着开始。

现在,我们都一直在讨论 GNU 的 screen,但这个小节的标题提到的是 tmux。 实质上, tmux (terminal multiplexer) 就像是 screen 的一个进阶版本,带有许多有用的额外功能,所以现在我们开始关注 tmux。 某些发行版本默认包含了 tmux; 在其他的发行版本上,通常只需要一个 apt-get、 yum installpacman -S 命令便可以安装它。

一旦你安装了它过后,键入 tmux 来启动它。接着你将注意到,在终端窗口的底部有一条绿色的信息栏,它非常像传统的窗口管理器中的任务栏: 上面显示着一个运行着的程序的列表、机器的主机名、当前时间和日期。 现在运行一个程序,同样以 Nano 为例, 敲击 Ctrl+B 后接着按 C 键, 这将在 tmux 会话中创建一个新的窗口,你便可以在终端的底部的任务栏中看到如下的信息:

0:nano- 1:bash*

每一个窗口都有一个数字,当前呈现的程序被一个星号所标记。 Ctrl+B 是与 tmux 交互的标准方式, 所以若你敲击这个按键组合并带上一个窗口序号, 那么就会切换到对应的那个窗口。你也可以使用 Ctrl+B 再加上 N 或 P 来分别切换到下一个或上一个窗口 – 或者使用 Ctrl+B 加上 L 来在最近使用的两个窗口之间来进行切换(有点类似于桌面中的经典的 Alt+Tab 组合键的效果)。 若需要知道窗口列表,使用 Ctrl+B 再加上 W。

目前为止,一切都还好:现在你可以在一个单独的终端窗口中运行多个程序,避免混乱(尤其是当你经常与同一个远程主机保持多个 SSH 连接时)。 当想同时看两个程序又该怎么办呢?

针对这种情况, 可以使用 tmux 中的窗格。 敲击 Ctrl+B 再加上 % , 则当前窗口将分为两个部分:一个在左一个在右。你可以使用 Ctrl+B 再加上 O 来在这两个部分之间切换。 这尤其在你想同时看两个东西时非常实用, – 例如一个窗格看指导手册,另一个窗格里用编辑器看一个配置文件。

有时,你想对一个单独的窗格进行缩放,而这需要一定的技巧。 首先你需要敲击 Ctrl+B 再加上一个 :(冒号),这将使得位于底部的 tmux 栏变为深橙色。 现在,你进入了命令模式,在这里你可以输入命令来操作 tmux。 输入 resize-pane -R 来使当前窗格向右移动一个字符的间距, 或使用 -L 来向左移动。 对于一个简单的操作,这些命令似乎有些长,但请注意,在 tmux 的命令模式(前面提到的一个分号开始的模式)下,可以使用 Tab 键来补全命令。 另外需要提及的是, tmux 同样也有一个命令历史记录,所以若你想重复刚才的缩放操作,可以先敲击 Ctrl+B 再跟上一个分号,并使用向上的箭头来取回刚才输入的命令。

最后,让我们看一下分离和重新连接 - 即我们刚才介绍的 screen 的特色功能。 在 tmux 中,敲击 Ctrl+B 再加上 D 来从当前的终端窗口中分离当前的 tmux 会话。这使得这个会话的一切工作都在后台中运行、使用 tmux a 可以再重新连接到刚才的会话。但若你同时有多个 tmux 会话在运行时,又该怎么办呢? 我们可以使用下面的命令来列出它们:

tmux ls

这个命令将为每个会话分配一个序号; 假如你想重新连接到会话 1, 可以使用 tmux a -t 1. tmux 是可以高度定制的,你可以自定义按键绑定并更改配色方案, 所以一旦你适应了它的主要功能,请钻研指导手册以了解更多的内容。

tmux

上图中, tmux 开启了两个窗格: 左边是 Vim 正在编辑一个配置文件,而右边则展示着指导手册页。

Zsh: 另一个 shell

选择是好的,但标准同样重要。 你要知道几乎每个主流的 Linux 发行版本都默认使用 Bash shell – 尽管还存在其他的 shell。 Bash 为你提供了一个 shell 能够给你提供的几乎任何功能,包括命令历史记录,文件名补全和许多脚本编程的能力。它成熟、可靠并文档丰富 – 但它不是你唯一的选择。

许多高级用户热衷于 Zsh, 即 Z shell。 这是 Bash 的一个替代品并提供了 Bash 的几乎所有功能,另外还提供了一些额外的功能。 例如, 在 Zsh 中,你输入 ls ,并敲击 Tab 键可以得到 ls 可用的各种不同选项的一个大致描述。 而不需要再打开 man page 了!

Zsh 还支持其他强大的自动补全功能: 例如,输入 cd /u/lo/bi 再敲击 Tab 键, 则完整的路径名 /usr/local/bin 就会出现(这里假设没有其他的路径包含 u, lobi 等字符)。 或者只输入 cd 再跟上 Tab 键,则你将看到着色后的路径名的列表 – 这比 Bash 给出的简单的结果好看得多。

Zsh 在大多数的主要发行版本上都可以得到了; 安装它后并输入 zsh 便可启动它。 要将你的默认 shell 从 Bash 改为 Zsh, 可以使用 chsh 命令。 若需了解更多的信息,请访问 www.zsh.org

“未来”的终端

你或许会好奇为什么包含你的命令行提示符的应用被叫做终端。 这需要追溯到 Unix 的早期, 那时人们一般工作在一个多用户的机器上,这个巨大的电脑主机将占据一座建筑中的一个房间, 人们通过某些线路,使用屏幕和键盘来连接到这个主机, 这些终端机通常被称为“哑终端”, 因为它们不能靠自己做任何重要的执行任务 – 它们只展示通过线路从主机传来的信息,并输送回从键盘的敲击中得到的输入信息。

今天,我们在自己的机器上执行几乎所有的实际操作,所以我们的电脑不是传统意义下的终端,这就是为什么诸如 XTerm、 Gnome Terminal、 Konsole 等程序被称为“终端模拟器” 的原因 – 他们提供了同昔日的物理终端一样的功能。事实上,在许多方面它们并没有改变多少。诚然,现在我们有了反锯齿字体,更好的颜色和点击网址的能力,但总的来说,几十年来我们一直以同样的方式在工作。

所以某些程序员正尝试改变这个状况。 Terminology (http://tinyurl.com/osopjv9), 它来自于超级时髦的 Enlightenment 窗口管理器背后的团队,旨在让终端步入到 21 世纪,例如带有在线媒体显示功能。你可以在一个充满图片的目录里输入 ls 命令,便可以看到它们的缩略图,或甚至可以直接在你的终端里播放视频。 这使得一个终端有点类似于一个文件管理器,意味着你可以快速地检查媒体文件的内容而不必用另一个应用来打开它们。

接着还有 Xiki (www.xiki.org),它自身的描述为“命令的革新”。它就像是一个传统的 shell、一个 GUI 和一个 wiki 之间的过渡;你可以在任何地方输入命令,并在后面将它们的输出存储为笔记以作为参考,并可以创建非常强大的自定义命令。用几句话是很能描述它的,所以作者们已经创作了一个视频来展示它的潜力是多么的巨大(请看 Xiki 网站的截屏视频部分)。

并且 Xiki 绝不是那种在几个月之内就消亡的昙花一现的项目,作者们成功地进行了一次 Kickstarter 众筹,在七月底已募集到超过 $84,000。 是的,你没有看错 – $84K 来支持一个终端模拟器。这可能是最不寻常的集资活动了,因为某些疯狂的家伙已经决定开始创办它们自己的 Linux 杂志 ......

下一代终端

许多命令行和基于文本的程序在功能上与它们的 GUI 程序是相同的,并且常常更加快速和高效。我们的推荐有: Irssi (IRC 客户端); Mutt (mail 客户端); rTorrent (BitTorrent); Ranger (文件管理器); htop (进程监视器)。 若给定在终端的限制下来进行 Web 浏览, Elinks 确实做的很好,并且对于阅读那些以文字为主的网站例如 Wikipedia 来说。它非常实用。

微调配色方案

在《Linux Voice》杂志社中,我们并不迷恋那些养眼的东西,但当你每天花费几个小时盯着屏幕看东西时,我们确实认识到美学的重要性。我们中的许多人都喜欢调整我们的桌面和窗口管理器来达到完美的效果,调整阴影效果、摆弄不同的配色方案,直到我们 100% 的满意(然后出于习惯,摆弄更多的东西)。

但我们倾向于忽视终端窗口,它理应也获得我们的喜爱,并且在 http://ciembor.github.io/4bit 你将看到一个极其棒的配色方案设计器,对于所有受欢迎的终端模拟器(XTerm, Gnome Terminal, Konsole 和 Xfce4 Terminal 等都是支持的应用。),它可以输出其设定。移动滑块直到你看到配色方案最佳, 然后点击位于该页面右上角的 得到方案 按钮。

相似的,假如你在一个文本编辑器,如 Vim 或 Emacs 上花费了很多的时间,使用一个精心设计的调色板也是非常值得的。 Solarized http://ethanschoonover.com/solarized 是一个卓越的方案,它不仅漂亮,而且因追求最大的可用性而设计,在其背后有着大量的研究和测试。


via: http://www.linuxvoice.com/linux-101-power-up-your-shell-8/

作者:Ben Everard 译者:FSSlc 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

我们经常会看到文件名和文件夹名。大多数时候文件/文件夹的名字和内容相关并以数字和字母开头。字母加数字的文件名最常见,应用也很广泛,但总会需要处理一些包含特殊字符的文件名/文件夹名。

注意:我们可能有各种类型的文件,但是为了简单以及方便实现,在本文中我们只用文本文件(.txt)做演示。

最常见的文件名例子:

abc.txt
avi.txt
debian.txt
...

数字文件名例子:

121.txt
3221.txt
674659.txt
...

字母数字文件名例子:

eg84235.txt
3kf43nl2.txt
2323ddw.txt
...

包含特殊字符的文件名的例子,并不常见:

#232.txt
#bkf.txt
#bjsd3469.txt
#121nkfd.txt
-2232.txt
-fbjdew.txt
-gi32kj.txt
--321.txt
--bk34.txt
...

一个显而易见的问题是 - 在这个星球上有谁会创建和处理包含井号(#),分号(;),破折号(-)或其他特殊字符的文件/文件夹啊。

我和你想的一样,这种文件名确实不常见,不过在你必须得处理这种文件名的时候你的 shell 也不应该出错或罢工。而且技术上来说,Linux 下的一切比如文件夹、驱动器或其他所有的都被当作文件处理。

处理名字包含破折号(-)的文件

创建以破折号(-)开头的文件,比如 -abx.txt。

$ touch -abc.txt

测试输出

touch: invalid option -- 'b'
Try 'touch --help' for more information.

出现上面错误的原因是,shell 把破折号(-)之后的内容认作参数了,而很明显没有这样的参数,所以报错。

要解决这个问题,我们得告诉 Bash shell(是的,这里以及本文后面的大多数例子都是基于 BASH 环境)不要将特殊字符(这里是破折号)后的字符解释为参数。

有两种方法解决这个错误:

$ touch -- -abc.txt     [方法 #1]
$ touch ./-abc.txt      [方法 #2]

你可以通过运行命令 ls 或 ls -l 列出详细信息来检查通过上面两种方式创建的文件。

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 11:05 -abc.txt

要编辑上述文件可以这样:

$ nano -- -abc.txt 
或者 
$ nano ./-abc.txt 

注意:你可以将 nano 替换为任何其他你喜欢的编辑器比如说 vim:

$ vim -- -abc.txt 
或者 
$ vim ./-abc.txt 

如果只是简单地移动文件可以这样:

$ mv -- -abc.txt -a.txt
或者
$ mv -- -a.txt -abc.txt

删除这种文件,可以这样:

$ rm -- -abc.txt
或者
$ rm ./-abc.txt 

如果一个目录下有大量这种名字包含破折号的文件,要一次全部删除的话,可以这样:

$ rm ./-*

重要:

  1. 上面讨论的规则可以同样应用于名字中包含任意数量以及任意位置的连接符号的文件。就是说,-a-b-c.txt,ab-c.txt,abc-.txt,等等。
  2. 上面讨论的规则可以同样应用于名字中包含任意数量以及任意位置连接符号的文件夹,除了一种情况,在删除一个文件夹的时候你得这样使用rm -rf

$ rm -rf -- -abc 或者 $ rm -rf ./-abc

处理名字包含井号(#)的文件

符号#在 BASH 里有非常特别的含义。#之后的一切都会被认为是评论,因此会被 BASH 忽略。

通过例子来加深理解:

创建一个名字是 #abc.txt 的文件:

$ touch #abc.txt

测试输出

touch: missing file operand
Try 'touch --help' for more information.

出现上面错误的原因是,BASH 将 #abc.txt 解释为评论而忽略了。所以命令 touch没有收到任何文件作为参数,所以导致这个错误。

要解决这个问题,你可能需要告诉 BASH 不要将 # 解释为评论。

$ touch ./#abc.txt
或者
$ touch '#abc.txt'

检查刚创建的文件:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:14 #abc.txt

现在创建名字中除了开头的其他地方包含 # 的文件。

$ touch ./a#bc.txt
$ touch ./abc#.txt    
或者
$ touch 'a#bc.txt'
$ touch 'abc#.txt'

运行 ‘ls -l‘ 来检查:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 a#bc.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 abc#.txt

如果同时创建两个文件(比如 a 和 #bc)会怎么样:

$ touch a.txt #bc.txt

检查刚创建的文件:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:18 a.txt

很明显上面的例子中只创建了文件 a 而文件 #bc 被忽略了。对于上面的情况我们可以这样做,

$ touch a.txt ./#bc.txt
或者
$ touch a.txt '#bc.txt'

检查一下:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:20 a.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:20 #bc.txt

可以这样移动文件:

$ mv ./#bc.txt ./#cd.txt
或者
$ mv '#bc.txt' '#cd.txt'

这样拷贝:

$ cp ./#cd.txt ./#de.txt
或者
$ cp '#cd.txt' '#de.txt'

可以使用你喜欢的编辑器来编辑文件:

$ vi ./#cd.txt
或者
$ vi '#cd.txt'

$ nano ./#cd.txt
或者
$ nano '#cd.txt'

这样删除:

$ rm ./#bc.txt 
或者
$ rm '#bc.txt'

要删除所有以井号(#)开头的文件,可以这样:

# rm ./#*

处理名字包含分号(;)的文件

如果你还不知道的话,分号在 BASH 里起到命令分隔的作用,其他 shell 可能也是一样的。分号作为分隔符可以让你一次执行几个命令。你碰到过名字包含分号的文件吗?如果没有的话,这里有例子。

创建一个名字包含分号的文件。

$ touch ;abc.txt

测试输出

touch: missing file operand
Try 'touch --help' for more information.
bash: abc.txt: command not found

出现上面错误的原因是,在运行上面命令的时候 BASH 会把 touch 解释为一个命令但是在分号前没有任何文件参数,所以报告错误。然后报告的另一个错误找不到命令 abc.txt,只是因为在分号后 BASH 会期望另一个新的命令,而 abc.txt 并不是一个命令。

要解决这个问题,我们得告诉 BASH 不要将分号解释为命令分隔符,例如:

$ touch ./';abc.txt'
或者
$ touch ';abc.txt'

注意:我们将文件名用单引号 '' 包含起来。这样可以告诉 BASH 分号 ; 是文件名的一部分而不是命令分隔符。

对名字包含分号的文件和文件夹的其他操作(就是,拷贝、移动、删除)可以直接将名字用单引号包含起来就好了。

处理名字包含其他特殊字符的文件/文件夹

文件名包含加号 (+)

不需要任何特殊处理,按平时的方式做就好了,比如下面测试的文件名。

$ touch +12.txt 

文件名包含美元符 ($)

你需要将文件名用单引号括起来,像处理分号那样的方式。然后就很简单了。

$ touch '$12.txt'

文件名包含百分号 (%)

不需要任何特殊处理,当作一个普通文件就可以了。

$ touch %12.txt

文件名包含星号 (*)

需要用单引号括起来或使用反斜杠转义。(LCTT 译注:此处原文有误,已修改。)

$ touch *12.txt

注意:当你需要删除星号开头的文件时,千万不要用类似下面的命令。

$ rm *
或者
$ rm -rf *

而是用这样的命令,(LCTT 译注:此处原文有误,已修改)

$ rm ./'*.txt'

文件名包含叹号 (!)

只要将文件名用单引号括起来,其他的就一样了。

$ touch '!12.txt'

文件名包含小老鼠 (@)

没有什么特别的,可以将名字包含小老鼠的文件当作普通文件。

$ touch '@12.txt'

文件名包含 ^

不需要特殊处理。可以将名字包含 ^ 的文件当作普通文件。

$ touch ^12.txt

文件名包含 (&)

将文件名用单引号括起来,然后就可以操作了。

$ touch '&12.txt'

文件名包含括号 ()

如果文件名包含括号,你需要将文件名用单引号括起来。

$ touch '(12.txt)'

文件名包含花括号 {}

用单引号括起来或使用反斜杠转义。(LCTT 译注:此处原文有误,已修改)

$ touch '{12.txt}'

文件名包含尖括号 <>

名字包含尖括号的文件需要用单引号括起来。

$ touch '<12.txt>'

文件名包含方括号 [ ]

用单引号括起来或使用反斜杠转义。(LCTT 译注:此处原文有误,已修改)

$ touch '[12.txt]'

文件名包含下划线 (\_)

这个非常普遍,不需要特殊对待。当作普通文件随意处理。

$ touch _12.txt

文件名包含等号 (=)

用单引号括起来或使用反斜杠转义。(LCTT 译注:此处原文有误,已修改)

$ touch '=12.txt'

处理反斜杠 ()

反斜杠会告诉 shell 忽略后面字符的特殊含义。你必须将文件名用单引号括起来,就像处理分号那样。其他的就没什么了。

$ touch '\12.txt'

包含斜杠的特殊情形

除非你的文件系统有问题,否则你不能创建名字包含斜杠的文件。没办法转义斜杠。

所以如果你能创建类似 ‘/12.txt’ 或者 ‘b/c.txt’ 这样的文件,那要么你的文件系统有问题,或者支持 Unicode,这样你可以创建包含斜杠的文件。只是这样并不是真的斜杠,而是一个看起来像斜杠的 Unicode 字符。

文件名包含问号 (?)

用单引号括起来或使用反斜杠转义。(LCTT 译注:此处原文有误,已修改)

$ touch '?12.txt'

文件名包含点 (.)

在 Linux 里以点 (.) 开头的文件非常特别,被称为点文件。它们通常是隐藏的配置文件或系统文件。你需要使用 ls 命令的 ‘-a‘ 或 ‘-A‘ 开关来查看这种文件。

创建,编辑,重命名和删除这种文件很直接。

$ touch .12.txt

注意:在 Linux 里你可能碰到名字包含许多点 (.) 的文件。不像其他操作系统,文件名里的点并不意味着分隔名字和扩展后缀。你可以创建名字包含多个点的文件:

$ touch 1.2.3.4.5.6.7.8.9.10.txt

检查一下:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 14:32 1.2.3.4.5.6.7.8.9.10.txt

文件名包含逗号 (,)

你可以在文件名中使用逗号,可以有任意多个而不用特殊对待。就像平时普通名字文件那样处理。

$ touch ,12.txt
或者
$ touch ,12,.txt

文件名包含冒号 (:)

用单引号括起来或使用反斜杠转义。(LCTT 译注:此处原文有误,已修改)

$ touch ':12.txt'
或者
$ touch ':12:.txt'

文件名包含引号(单引号和双引号)

要在文件名里使用引号,我们需要使用交替规则。例如,如果你需要在文件名里使用单引号,那就用双引号把文件名括起来。而如果你需要在文件名里使用双引号,那就用单引号把文件名括起来。(LCTT 译注:或者如果单引号和双引号混杂的情况,你也可以用反斜杠转义。)

$ touch "15'.txt"

以及

$ touch '15".txt'

文件名包含波浪号 (~)

Linux 下一些像 emacs 这样的文本编辑器在编辑文件的时候会创建备份文件。这个备份文件的名字是在原文件名后面附加一个波浪号。你可以在文件名任意位置使用波浪号,例如:

$ touch ~1a.txt
或者
$touch 2b~.txt

文件名包含空格

创建名字的字符/单词之间包含空格的文件,比如 “hi my name is avishek.txt”。

最好不要在文件名里使用空格,如果你必须要分隔可读的名字,可以使用下划线或横杠。不过,你还是需要创建这样的文件的话,你可以用反斜杠来转义下一个字符。要创建上面名字的文件可以这样做。

$ touch hi\ my\ name\ is\ avishek.txt

hi my name is avishek.txt

我已经尝试覆盖你可能碰到的所有情况。上面大多数测试都在 BASH Shell 里完成,可能在其他 shell 下会有差异。

如果你觉得我遗漏了什么(这很正常也符合人性),请把你的建议发表到下面的评论里。保持联系,多评论。不要走开!求点赞求分享求扩散!


via: http://www.tecmint.com/manage-linux-filenames-with-special-characters/

作者:Avishek Kumar 译者:zpl1025 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出