[原创]一些未归类的命令、操作方法或问题总结(3)

下面是一些未归类的命令及操作方法,专门记在此文中,以便将来查询。由于文章较长,请用Ctrl+F查询关键字来定位到你需要的内容。

(1)使emacs不要生成临时文件
在emacs中编辑了文件并保存后,通常会生成一个临时文件,假设原文件名为a.txt,则生成的临时文件名为a.txt~,如果不想生成,可以在emacs配置文件 .emacs 中添加一句:
(setq-default make-backup-files nil)

(2)按Ctrl+Z键导致emacs“退出”时,如何恢复
在emacs中,按Ctrl+Z键本应是标记选择开始(mark)的快捷键,但是如果设置不当(经总结,这个设置不仅涉及linux主机的环境设置,而且涉及终端软件例如SecureCTR的设置),会导致Ctrl+Z键成为中断命令,使得emacs立即“退出”——其实这个退出并不是真正地退出了emacs,而是使之进入了挂起的状态,不信你可以用如下命令查看:

ps -ef | grep emacs | grep -v grep

要恢复这个退出前台的emacs进程,执行 fg 命令即可。

(3)在Xshell中,emacs的退格键(backspace)不起作用的解决办法
在Xshell这个终端软件中,emacs的退格键默认应该是不能删除光标之前的一个字符的,这非常不方便。为了实现退格键删除光标前一个字符的效果,你应该修改此session的属性如下:

xshell keyboard setting for backspace act normal in emacs
文章来源:http://www.codelast.com/

其实需要修改的默认设置就是“Backspace key sequence”那一项,将其改为“ASCII 127”即可。

(4)在Xshell中,emacs的Home/End键失效的问题
具体情况就是按Home/End键无法跳到光标所在行的行头/行尾。
已经有人在这个链接里反映了,但是不知道Xshell的哪一个版本会提供解决方案。
如果你想找一个折衷的解决办法,可以用 Ctrl+A 来代替 Home 键,使用 Ctrl+E 来代替 End 键。

(5)在vim将TAB替换为其他字符
假设要将文件中的TAB替换为逗号“,”,可以在命令模式下执行以下命令:

:%s/^I/,/g

其中,^I 表示按一下TAB键(会显示为 ^I)。

(6)用awk将一个字符串中的空白替换为指定的字符串
例如,文件a.txt中仅含有一行“12[TAB]23[TAB]34[TAB][TAB]abc”,其中[TAB]代表分隔符tab。现在要将“abc”前的两个tab中的空白替换为指定的字符串“ui”,则:

[root@localhost test]$ cat a.txt | awk -F"\t" '{if(length($4) == 0) print $1"\t"$2"\t"$3"\tui\t"$5}'
12	23	34	ui	abc

注意这里的“-F”的作用是指定了分隔符为tab,如果不指定的话,会把字符串“abc”当作$4,从而得到错误的结果

(7)man X command,这个X代表的到底是什么
假设你要查看wget命令的说明,可以用如下命令:

man 1 wget

或者直接 man wget 也可以。那么,这里的“1”代表什么意思呢?请仔细参考以下命令的说明吧:

man 7 man

这里就把一部分摘抄出来:

The manual sections are traditionally defined as follows:
 
1 Commands
Those commands that can be executed by the user from within a shell.
2 System calls
Those functions which must be performed by the kernel.
3 Library calls
Most of the libc functions, such as qsort(3).
4 Special files
Files found in /dev.
5 File formats and conventions
The format for /etc/passwd and other human-readable files.
6 Games
7 Conventions and miscellaneous
A description of the standard file system layout, network protocols, ASCII and other character codes,
this man page, and other things.
8 System management commands
Commands like mount(8), many of which only root can execute.
9 Kernel routines
This  is  an  obsolete  manual section.  Once it was thought a good idea to document the Linux kernel
here, but in fact very little has been documented, and the  documentation  that  exists  is  outdated
already. There are better sources of information for kernel developers.

含义清晰可见。
那么,我又如何知道一个查询的 man X 中的X应该是几呢?假设你要查询 getopt 函数的用法,那么我应该是用 man 1 getopt 呢,还是 man 2 getopt 呢,还是 man 3 getopt 呢……
你可以这样确定:

[root@localhost ~]# man -f getopt
Getopt::Long         (3pm)  - Extended processing of command line options
getopt               (1)  - parse command options (enhanced)
getopt               (3)  - Parse command-line options
getopt               (3p)  - command option parsing
getopt [Getopt::Std] (3pm)  - Process single-character switches with switch clustering

这个输出结果告诉了我们可以用哪些“X”。
文章来源:http://www.codelast.com/
(8)Linux下按文件名进行查找的几种方法
whereislocatefind 命令均可进行查找,但find速度慢,其余两个快,因为其余两个实际上没有直接对硬盘进行搜索。

(9)同样是切换登录身份的命令,su usernamesu - username 有什么不同?
命令 su username 只是切换了登录身份,但并不会将当前目录切换到该用户的根目录下,而 su - username 不仅切换了登录身份,同时也将当前目录切换到了该用户的根目录下。对这一点,你可以使用 pwd 命令来查证。

(10)Linux下关闭屏幕/显示器的命令

xset dpms force off

据说要显示器支持Energy Star,而且在xorg.conf中也要设置好某些选项——我没去研究,因为在我的Ubuntu上是直接就用此命令关闭显示器的。

(11)Ubuntu下无法 ssh localhost
一定要记得先检查 openssh-server 安装没有,如果没有,是不可能 ssh localhost 的。在Ubuntu下安装很简单:

apt-get install openssh-server

然后要检查是否设置了合适的ufw(Ubuntu防火墙)规则。
最后,如果你要实现无密码ssh登录,执行以下两条命令:

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

这样就搞定了。

(12)在Ubuntu下以root身份运行Google Chrome浏览器的问题
在默认安装情况下,以root身份运行Chrome会报错,提示“--user-data-dir”之类的错误,解决这个问题的方法相当简单,只要在Chrome的启动命令中添加上“--user-data-dir”,即:

/opt/google/chrome/google-chrome %U --user-data-dir

这样就可以正常使用了。
文章来源:http://www.codelast.com/
(13)在Ubuntu下,以源码方式安装Vim 7.3时,报错“You need to install a terminal library”的解决办法
在configure的时候报如下错误:

checking for tgetent()... configure: error: NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with --with-tlib.
这个错误可以通过先安装一个包来解决:

apt-get install libncurses5-dev

然后就可以顺利通过configure了。

(14)在Ubuntu 11.04下,让命令行不要显示完整路径
命令行显示完整路径时,进入一层层的目录后,会变得非常长,导致在小屏幕上显示效果非常差。因此有必要改一下:
修改用户根目录下的.bashrc文件,找到这几行:

case "$TERM" in
xterm*|rxvt*)
    PS1="

\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a

$PS1"

将PS1那一行改为:

PS1="[\u@ \W]\$ "

然后手工加载一下.bashrc文件(source .bashrc)就可以啦。

(15)用git检出一个代码库时,揭示“error: SSL certificate problem, verify that the CA cert is OK”的解决办法
如果要checkout的代码库是https的链接,则使用git在Linux命令行下将其checkout可能会揭示错误,例如:

[root@localhost mydir]# git clone https://github.com/abc/XXX.git
Cloning into mydir...
error: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing https://github.com/abc/XXX.git/info/refs

fatal: HTTP request failed

可见是由于SSL证书的问题导致无法chechout代码库。
在这里,有一个可以跳过证书检查的办法(但你要自己确认那是安全的):

env GIT_SSL_NO_VERIFY=true git clone https://github.com/abc/XXX.git

这样就可以成功地checkout代码库了。

(16)用awk判断某字符串中是否含有指定的字符串
假设你要查找某文件a.txt中含有字符串“rstuvw”的行,如果找到了,则输出它们,那么你可以这样做:

cat a.txt | awk '{if($0~/rstuvw/) print $0}'

其中,$0表示整行,被搜索的字符串用斜杠括起来,波浪号~表示搜索指定的字符串(如果你要改成“不含有指定的字符串”,则此处应将波浪号改为!~)。
假如你要在搜索字符串的时候,要查找含字符串“rstuvw”或字符串“abcde”,该怎么写?如下:

cat a.txt | awk '{if($0~/rstuvw/ || $0~/abcde/) print $0}'

或者:

cat a.txt | awk '{if($0~/(rstuvw||abcde)/ print $0}'

都可以。
文章来源:http://www.codelast.com/
(17)将指定的目录加入系统的库搜索路径
假设你要将 /home/mylib 目录加入系统的库文件搜索路径,则可以修改 /etc/ld.so.conf 文件,在里面添加上一行写上这个路径,然后再运行一次 ldconfig 命令即可。

(18)怎样删除Win7下的 hiberfil.sys 文件
这个文件通常是在C盘根目录下,并且很大,它的作用是为Win7的“休眠”模式提供一个保存内存文件的地方,使得你把计算机恢复到正常运行模式后,系统可以从中读出内容,从而恢复到之前的状态。
要删除这个文件,其实你只要把Win7的休眠模式给禁用就可以了。以管理员身份运行命令行,执行以下命令:

powercfg -h off

然后就就会发现C盘根目录下的hiberfil.sys文件已经自动被删除了,并且在Win7关机菜单中,原来的“休眠”菜单就消失了。

(19)为Emacs自定义“跳到指定行”的快捷键 & “替换字符串”的快捷键
由于在某些终端软件下 M-x goto-line 的快捷键会失效,并且这么长的命令没有哪个人愿意去输入,因此为Emacs自定义一个“跳到指定行”的快捷键是非常有必要的。方法就是在 .emacs 配置文件中添加如下一行:

(define-key ctl-x-map "l" 'goto-line)

这样的话,你先按 Ctrl+X,再按 l 键,输入行号,就可以跳到指定行了,非常方便。
同样,M-x replace-string(替换字符串)的快捷键也可以自定义,类似于上面的方法,添加一行:

(define-key ctl-x-map "r" 'replace-string)

这样,你先按 Ctrl+X,再按 r 键,就可以按提示进行字符串替换操作了。

(20)bash shell中获取输入的参数个数
不必多说,看这段shell code即可

if [ $# != 1 ]; then
    echo "Must provide an argument"
    exit 1
fi

文章来源:http://www.codelast.com/
(21)SQLyog的帐号配置文件保存的位置
SQLyog的帐号文件/配置文件并不会保存在你的安装目录下,而是保存在系统盘的某个目录下,所以,如果你重装了系统,再打开SQLyog的话,就会发现“连接到MySQL主机”对话框中原来保存的帐号都没了,所以你最好在长时间使用SQLyog之后对其帐号配置文件做一个备份,否则哪天重装了系统,什么都没了。
对Win7来说,这个目录一般是:
C:\Users\用户名\AppData\Roaming\SQLyog
该目录下的 sqlyog.ini 即为帐号配置文件。
如果是WinXP,该目录可能是(未验证正确与否):
C:\Documents and Settings\用户名\Application Data\SQLyog\sqlyog.ini

(22)在Linux命令行下临时通过代理服务器上网

export http_proxy=http://192.168.7.99:8080

表示通过192.168.7.99服务器,8080端口这个代理来上网。然后你可以用elinks(Linux下的一个文本浏览器)来试试:

elinks

输入一个正确的URL并访问之,如果可以用的话,就说明成功了。

(23)在Xshell等终端软件中按Ctrl+S导致失去响应的问题
在Xshell等终端软件中按Ctrl+S快捷键后,你会发现会话像死掉了一样,按什么键都没有反应了,其实它不是死掉了,而是Ctrl+S使得屏幕(的显示)被锁定了,以至于你按的所有键都不会反映到屏幕上,这时候,你只要按Ctrl+Q快捷键,就会恢复到原来的状态,这时你会发现,你在锁屏期间按的键都被输出到了屏幕上(只是在锁屏的时候你看不到罢了)。

(24)设置Linux命令的别名
在某用户的根目录下的 .bashrc 文件中,添加一行:

alias emacs="emacs -nw"

这样当你打 emacs 命令时,就是以 emacs -nw 命令来执行的,省去了每次多输入一些内容的繁琐。

(25)整型的IP地址转换为字符串形式的IP地址的简单方法
如果你不是用程序来转换,那么有一个简单的方法:用计算器,将整型的IP(例如“2227384585”)地址转换为16进制的形式(例如“84C33109”),然后把每两位转换成一个10进制的数,例如:

十六进制的 84 → 十进制的 132
十六进制的 C3 → 十进制的 195
十六进制的 31 → 十进制的 49
十六进制的 09 → 十进制的 9

因此转换为字符串的IP地址就是:132.195.49.9

(26)彩色显示grep的结果
如果你 cat 一个文件,并且 grep 某个关键字,得到的结果是一大堆文字的话,那么,在终端下你肯定看不清你查找的关键字在在哪里,这时,如果能把它用不同的颜色来显示,肯定是特别有帮助的。你只需要在用户根目录下的 .bash_profile 中添加如下两行:

export GREP_OPTIONS='--color=always'
export GREP_COLOR='1;32'

就可以达到想要的效果了。

(27)如何使 svn diff 命令生成只含英文字符的结果
假设你在Windows命令行下使用SVN客户端,那么光安装Tortoise SVN是不行的,默认的Tortoise SVN安装之后并不含svn.exe,所以无法使用svn命令,这时,你可以安装SlikSVN软件,它提供了命令行的svn.exe。安装好之后,在Winodws的环境变量的 Path 中添加上SlikSVN的可执行程序路径,例如:

C:\Program Files\SlikSvn\bin\

就可以在Windows命令行任一目录下执行 svn 命令了。
然后,切换到你有SVN版本控制的工程的根目录下,执行以下命令:

svn diff > test.diff

这样就会把该工程[当前的工作拷贝]与[仓库]中的代码的差异记录到 test.diff 文件中。如果你的Windows操作系统是中文的话,那么,生成的 test.diff 文件前几行应该是会包含中文内容的,例如,英文的“working copy”变成“工作拷贝”。
文章来源:http://www.codelast.com/
似乎中文的也没什么问题,不过,如果你在这个Review Board这个code review的工具中使用该 diff 文件,在里面创建一个新的Review Request时,就会报错了:

Something broke! (Error 500)
 
It appears something broke when you tried to go to here. This is either a bug in Review Board or a server configuration error. Please report this to your administrator. 

其实,这个错误完全就是由于Review Board不能识别中文导致的。解决这个问题的办法也很简单,只要把SlikSVN的安装目录下的 Share\Locale\ 目录下的所有文件全部删掉就可以了(这些东西是用于支持多语言的)。

(28)如何配置nginx使得访问一个域名自动跳转到另一个域名
例如,你拥有 a.com 和 b.com 两个域名,它们都指向了相同的web server(nginx),如何配置nginx,使得你访问a.com的时候,自动跳转到b.com呢?
只需要修改nginx的“server”参数,如下:

server {
   listen   80;
   server_name www.a.com a.com www.b.com b.com;

   if ($host = 'a.com') {
	   rewrite ^/(.*)$ http://b.com/\ redirect;
   }
   
   #后面的内容省略
}

这样,a.com的流量就被重定向到b.com了。

(29)shell如何判断两个字符串相等
先看代码:

if [[ "$VAR"x = "str"x ]]; then
  echo "Equal."
fi

这种有点奇怪的判断方式,却是比较可靠的方式。原因:
使用两个方括号([[ 以及 ]]),否则可能会提示错误:[: missing `]'
本例是判断变量 VAR 中的字符串是否与“str”这个字符串相等,之所以在它们后面再加一个x,是因为如果 VAR 为空,并且没有 x 的话,就会报错:[: =: unary operator expected
在VAR为空并且有 x 的时候,表达式就变成 x = strx,二者是不相等的,并且不会出现语法错误。
表达式中是用一个等号,而不是两个等号。

(30)linux shell中,sort如何按第二列排序
假设有以下数据文件:

[root@localhost ~]$ cat a.txt 
abcd	8
efgh	0
ijkl	5
mnop	3
qrst	1

如何按第二列的升序排序?

[root@localhost ~]$ sort -k 2 a.txt 
efgh	0
qrst	1
mnop	3
ijkl	5
abcd	8

如果要按降序排序,将 k 变成 rk 就可以了。

文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):

wechat qrcode of codelast