linux执行sh,出现/bin/sh^M: bad interpreter: No such file or directory

一般情况是出现了出现这种情况,通过vim命令查看系统编码格式,

#vim filename

:set fileformat(或者:set ff)

可以看到 fileformat=dos

分析是系统编码格式造成的异常,解决方案:

1、直接这vim中执行

:set fileformat = unix或者:set ff = unix

:wq

保存后的文件就强制转为unix系统编码格式;

有时候需要多个文件转化系统编码格式,那么用第二个方法就更加简单了,

2、使用dos2unix工具

dos2unix用法:

Usage: dos2unix [options] [file ...] [-n infile outfile ...]
-ascii convert only line breaks (default)
-iso conversion between DOS and ISO-8859-1 character set
-1252 Use Windows code page 1252 (Western European)
-437 Use DOS code page 437 (US) (default)
-850 Use DOS code page 850 (Western European)
-860 Use DOS code page 860 (Portuguese)
-863 Use DOS code page 863 (French Canadian)
-865 Use DOS code page 865 (Nordic)
-7 Convert 8 bit characters to 7 bit space
-c, --convmode conversion mode
convmode ascii, 7bit, iso, mac, default to ascii
-f, --force force conversion of binary files
-h, --help give this help
-k, --keepdate keep output file date
-L, --license display software license
-l, --newline add additional newline
-m, --add-bom add UTF-8 Byte Order Mark
-n, --newfile write to new file
infile original file in new file mode
outfile output file in new file mode
-o, --oldfile write to old file (default)
file ... files to convert in old file mode
-q, --quiet quiet mode, suppress all warnings
always on in stdio mode
-s, --safe skip binary files (default)
-ul, --assume-utf16le Assume that the input format is UTF-16LE
-ub, --assume-utf16be Assume that the input format is UTF-16BE
-F, --follow-symlink follow symbolic links and convert the targets
-R, --replace-symlink replace symbolic links with converted files
(original target files remain unchanged)
-S, --skip-symlink keep symbolic links and targets unchanged (default)
-V, --version display version number

安装dos2unix,

$sudo apt-get install dos2unix

对文件执行编码格式转换,

dos2unix filename 

多文件转换,

dos2unix file1 file2 file3

若需要把文件夹中所有文件都转换,在文件夹中执行

find -type f | xargs dos2unix

 

 

附xargs用法: 

  xargs是一条Unix和类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

Usage: xargs [-0prtx] [--interactive] [--null] [-d|--delimiter=delim]
[-E eof-str] [-e[eof-str]] [--eof[=eof-str]]
[-L max-lines] [-l[max-lines]] [--max-lines[=max-lines]]
[-I replace-str] [-i[replace-str]] [--replace[=replace-str]]
[-n max-args] [--max-args=max-args]
[-s max-chars] [--max-chars=max-chars]
[-P max-procs] [--max-procs=max-procs] [--show-limits]
[--verbose] [--exit] [--no-run-if-empty] [--arg-file=file]
[--version] [--help] [command [initial-arguments]]

 

附网友的解释http://blog.csdn.net/zhangfn2011/article/details/6776925

 

-0 当sdtin含有特殊字元时候,将其当成一般字符,像/'空格等

 root@localhost:~/test#echo "//"|xargs  echo 

  root@localhost:~/test#echo "//"|xargs -0 echo 

       /

-a file 从文件中读入作为sdtin,

root@localhost:~/test#cat test 
#!/bin/sh
echo "hello world/n"
root@localhost:~/test#xargs -a test echo
#!/bin/sh echo hello world/n
root@localhost:~/test#

-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。

root@localhost:~/test#cat txt
/bin tao shou kun
root@localhost:~/test#cat txt|xargs -E 'shou' echo
/bin tao
root@localhost:~/test#

-p 当每次执行一个argument的时候询问一次用户。

root@localhost:~/test#cat txt|xargs -p echo

echo /bin tao shou kun ff ?...y

/bin tao shou kun ff

-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。

root@localhost:~/test#cat txt|xargs -n1 echo
/bin
tao
shou
kun
root@localhost:~/test3#cat txt|xargs  echo
/bin tao shou kun

-t 表示先打印命令,然后再执行。

root@localhost:~/test#cat txt|xargs -t echo
echo /bin tao shou kun 
/bin tao shou kun

-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给{},可以用{}代替。

$ ls | xargs -t -i mv {} {}.bak

-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。

root@localhost:~/test#echo ""|xargs -t mv
mv 
mv: missing file operand
Try `mv --help' for more information.
root@localhost:~/test#echo ""|xargs -t -r  mv
root@localhost:~/test#
(直接退出)

-s num 命令行的最好字符数,指的是xargs后面那个命令的最大命令行字符数。

root@localhost:~/test#cat test |xargs -i -x  -s 14 echo "{}"
exp1
exp5
file
xargs: argument line too long
linux-2
root@localhost:~/test#

-L  num Use at most max-lines nonblank input lines per command line.-s是含有空格的。

-l  同-L

-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符

root@localhost:~/test#cat txt |xargs -i -p echo {}
echo /bin tao shou kun ?...y
root@localhost:~/test#cat txt |xargs -i -p -d " " echo {}
echo /bin ?...y
echo tao ?.../bin
y
echo shou ?...tao
再如:
root@localhost:~/test#cat test |xargs -i -p -d " " echo {}
echo exp1
exp5
file
linux-2
ngis_post
tao
test
txt
xen-3
 ?...y
root@localhost:~/test#cat test |xargs -i -p echo {}
echo exp1 ?...y
echo exp5 ?...exp1
y
echo file ?...exp5
y

-x exit的意思,主要是配合-s使用。

-P 修改最大的进程数,默认是1,为0时候为as many as it can 

 

posted @ 2015-11-11 17:09  瓦匠Mr.sweet  阅读(1273)  评论(0编辑  收藏  举报