虚拟机以及安装linux系统
安装新的virtualBox 1. VB ---> new aaa--->...new disk...--->finish 2. open aaa--->choose ubuntu-12.04-desktop-i386.iso --> ...click icon of install unbuntu --> about 30m, it'll restart --> 右下角图标,点击移除iso磁碟 3. install guest addtional in ubuntu menu // 共享,粘贴等重要功能 安装失败:sudo apt-get install build-essential // 安装一堆开发工具gcc,make等 4. 打开命令行: ctrl + alt + t 使window与virtualBox互相粘贴: 可直接在设置中修改:设置--〉一般--〉进阶 设置VB与window互访: 设置--〉共用资料夹 全勾选后并不需要下面的操作 ( mount -t vboxsf win_folder /mnt/windows // write this to /etc/rc.local ) 访问windows文件夹:ll /media/windowBag/ vdi文件的位置:设置--〉存放装置 F:\A_myTOP\ubuntu_12.04.1_null.vdi D:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso vb扩容:用UUID或者vdi文件来设置 (1) D:\Program Files\Oracle\VirtualBox>VboxManage list hdds VBoxManage modifyhd 96fe8d50-7b14-4acf-a2f6-fd63ba59debd --resize 20480 VBoxManage modifyhd E:\wiUCS_project\webRTC\dld_doc\ubuntu_12.0.4.vdi.vdi --resize 20480 // 单位MB,so 20G (2)fdisk , mkfs, mount 原来的扩张分区,导致新的磁盘空间无法在fdisk中显示 // 删除扩展分区后,再加入新分区,就 OK了 fdisk /dev/sda; m == menu ; d == del; n = new; w==write; 加入分区后要重启后,系统才认得。 mkfs -t ext3 /dev/sda2 ; mount /dev/sda2 /home/ding/extented_disk 安装新的VMware VMware 配置 v0 : bridge v1 : host-only v8 : NAT(多了DHCP,NAT server ) 新建aaa--->打开aaa,装入CentOS-6.3-x86_64-bin-DVD1.iso后,安装mini--->install vmware tools(自带,互相粘贴等功能) 1。需要修改网络配置:改为桥接后,/etc/sysconfig/network-script/ifcfg-eth0,另onboot=yes,MM_controlled=no 2. 修改DNS: echo "nameserver 8.8.8.8" > /etc/resolv.conf 3. 控制台没有滚动条,用shift+pageUp翻页 通过filezilla访问linux sudo apt-get install openssh-server // 在VB中安装ssh/ftp server ,上传失败时以root登录 sudo passwd root // 修改密码 进入其它linux系统 sudo -s // 只有root用户,是所有机器上都有的角色;切换到root用户后,以root登陆ssh服务器 ssh other's IP // ssh user@ip 文件传输 安装ssh server, 用sftp进行安全的文件传输。其实sftp就是ssh 的一个程式 sftp [email protected] 下载: sftp > get /remote/index.php /local/ 上传: sftp > put /local/Linuxgl.pdf /remote/fuyatao/ 远端的命令: pwd命令可以帮您查询远程主机的当前路径。查询本机当前工作目录 lpwd. // 本机都加l=local 访问ftp服务器 sudo ftp 10.5.90.10 //windows上的 name: anonymous ftp > cd temp/Whiteboard/lynckia_bag ftp > ls ftp > get lynckia_jinwei.tar.gz newName_lynckia.tar.gz
安装
在线安装 ubuntu: apt-get install XXX XXX 更新源:备份后搜索源来更新此文件 /etc/apt/source.list ; 再执行 sudo apt-get update centos: yum -y install XXX XXX 包安装 ubuntu: dpkg -i XXX.deb centos: rpm -ivh XXX.rpm // http://rpm.pbone.net/ ——这是一个给力的rpm包网站。 (-i==install, v=详细信息,h=hash, -e=erase删除,-U=升级) 安装包的转换rpm--->deb apt-get install alien alien --scripts *.rpm 检查是否已经安装 centos: rpm -qa |grep dhcp ubuntu: dpkg --get-selections | grep office // 查找libreoffice是否卸载完成,否则用purge清除 apt-get purge libreoffice* 更新ubuntu ubuntu--->system--->manager--->upgrade mini版本安装后用yum下载 1。需要修改网络配置:改为桥接后,/etc/sysconfig/network-script/ifcfg-eth0,另onboot=yes,MM_controlled=no 2. 修改DNS: echo "nameserver 8.8.8.8" > /etc/resolv.conf 3. yum -y update 4. yum search XXX; yum install -y XXXX yum建立本地源后进行安装: Yum: Yellowdogy Updater Modified.软件仓库(repository)的源,可以是http,ftp站点,或者是本地的资源。 createrepo这个软件可以解决软件之间的依赖。 1. 在线下载nfs安装包: 先修改配置文件vi /etc/yum.conf 另 keepcache =1 yum install nfs-utils.x86_64 2. 默认从网上下载的安装文件存放在:/var/cache/yum,把之下的nfs相关的rpm包全部拷贝到/mnt/nfsSrc/x86_64 cp *.rpm /mnt/nfsSrc/x86_64 3. 创建软件库 createrepo /mnt/nfsSrc/ vi /etc/yum.repo.d/base.repo 另 baseurl=file:///mnt/nfsSrc/ 4. 从本地源安装 yum install nfs-utils.x86_64 配置安装NFS 直接在本地包中安装:cd /mnt/nfsSrc/ ; rpm -ivh *.rpm 服务器: 配置: cat /etc/exports /mnt/nfsServer 10.50.141.0/24(ro,no_root_squash) // 把某目录给这些地址共享(只读,root权限) 启动:/etc/init.d/rpcbind start /etc/init.d/nfs start 检查:showmount -a 客户端: 检查服务器是否可用: showmount -e 10.50.141.22 挂载到服务器: mount -t nfs 10.50.141.22:/mnt/nfsServer /mnt/nfsClient -o nolock 未做的: yum install rpcbind(centos6) 将nfs加入开机启动项chkconfig nfs on 安装配置jdk 0. 查看已经安装的版本: java -version 1. 安装bin或者把得到的jdk包直接拷贝到某目录 2. 设置环境变量: centos: vi /etc/profile ; source /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_45 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin 3. 更新java版本 update-alternatives --install /usr/bin/java java /usr/java/jdk1.7.0/bin/java 60 update-alternatives --config java 4. 验证: java 安装eclipse ubuntu_eclipse_install // install package 安装jdk: sudo dpkg -i java-1.6.0-openjdk_1.6.0.0-2.7_i386.deb 安装eclipse: eclipse-linuxtools-helios-SR1-incubation-linux-gtk.tar.gz 配置: sudo cp -r /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre ./
linux环境变量
显示变量: env; export; echo $WELCOME 设置新的: set env var; export WELCOME="hello"; 设置只读: readonly WELCOME // (unset WELCOME) can't clear or modify 仅当前shell(控制台)有效: PATH=$PATH:/home/myplugin // linux用冒号分隔,window用分号 export: 1. 在控制台中执行脚本时,控制台是父shell, 脚本运行在子shell 2. 环境变量仅仅在当前shell中有效;当用export导出变量时,变量将在子shell中有效 so 当前和子shell(控制台中执行的script)有效: 控制台中执行 export PATH=$PATH:/home/temp 重启后仍有效: 将export那句添加到配置文件 centos: /etc/profile // all user /home/brian/.bashrc // only user brian source /etc/porfile // 配置文件立即生效 将脚本的执行结果导入到当前的shell: . ./ding_exec.sh or . /var/psbl_env /var/psbl_env 导出某变量,这个结果导入到当前shell(控制台)。所以在控制台中执行的CLI(子shell)能够通过 getenv() 得到该变量
启动
1. 图形界面和字符界面的切换 alt+ctrl+F1-6 : 图形->字符 alt+ctrl+F7 : 字符->图形 2. 启动时指定界面: 3:字符 5:图形 vi /etc/inittab // 0:停止, 1:单用户, 2:多用户无NFS, 4:无用, 6:重启 3. 重新启动: alt+ctrl+Backspace 4. 当前运行级别时间: who -r
网络
显示以及临时修改 ifconfig eth0:0 XXX netmask XXX [boardcast XXX] // 在eth0上增加另一个IP ifconfig eth0:0 down // 删除eth0:0 ifconfig eth0 XXX netmask XXX route -n == netstat -rn route add -net XXX netmask XXX gw XXX // route del -net... route add default gw 192.168.1.1 hostname XXX centos配置文件: 修改IP: /etc/sysconfig/network-scripts/ifcfg-eth0 //配置静态的 BOOTPROTO=static 1.拷贝VMware后,需要修改mac地址(在VM设置中), service network restart/reboot(卸载virtualBox可能网卡被占用) 2.增加一个网口,拷贝ifcfg-eth0后,修改重启即可。 DNS域名修改: /etc/resolv.conf 修改HOSTNAME: /etc/sysconfig/network ubuntu配置文件: 修改IP: /etc/network/interfaces // address 192.168.0.111... 重启: sudo /etc/init.d/networking stop/start 下载分享 $ wget http://192.168.30.140/cgiPic/screen.bmp -O ./ttt.bmp // 其他类似工具axel, lftp $ curl http://192.168.30.140/CGI/Screenshot -u dld:dld // 密码 python -m SimpleHTTPServer 8080 // 在需要共享的文件夹下执行此命令。 通过http://ip:8080来访问 sudo dhclient // client obtain ip via dhcp server
信号
# kill -l 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 16) SIGSTKFLT 18) SIGCONT 19) SIGSTOP ...... 信号0: // 退出shell。 ctrl+D 1) SIGHUP // 父进程结束,子进程收到。比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。 2) SIGINT // 来自键盘的终止: ctrl+C 3) SIGQUIT // 从键盘退出: ctrl+\ 9) SIGKILL // 无条件终止: kill -9 进程号 15) SIGTERM // 程序正常退出时的处理 17) SIGCHLD // 子进程结束时,父进程会收到 20) SIGTSTP // 暂停并挂起,在屏幕上显示挂起的进程号: crtl+Z
进程
后台运行 crtl+Z // 暂停并挂起,在屏幕上显示挂起的进程号 bg num // 将暂停的程序放到后台运行 jobs // 显示后台运行的程序 fg num // 将暂停的程序放回前台运行 杀死 通过名字 sudo killall/pkill node 通过关键字杀掉多个相同的进程 PIS=`ps -efww | grep "$1" | grep -v "grep" | awk '{print $2}'` echo ${PIS} | xargs kill 查询 ps -ef|grep careStr // ps -aux netstat -apn |grep :22 // t=tcp, n=num, p=program, l=listen, a=all lsof -i :22 // 根据端口号,谁在用22端口 让终端忽略挂断信号nohup: no hangup & // 让命令在后台运行; >file 2>&1 // 输出到某文件,否者输出到nohup.out nohup $DAEMON_SH $PROCESS_CVT > $CVT_HOME/log/cvt.log 2>&1 & 打印进程中的线程个数 ps max -o %mem, lstart,lwp,pid,nlwp,cmd // 打印进程的:开始时间,tID,pID, 线程的个数,命令名 # ps max -o pid,nlwp,cmd |grep 3067 3067 270 node erizoController.js // 验证: ls /proc/3067/task 通过进程的pid可以得到线程的tid 线程:linux中每个进程的最大线程个数 = VIRT / 栈的大小 VIRT:virtual memory usage ; 栈大小用 ulimit -a查看 NTPL : linux中线程的实现的库 # getconf GNU_LIBPTHREAD_VERSION
系统
df -[ikmh] // 查看硬盘使用容量 h = human du -[acs bkm] 目录 //查看档案的容量 du -sh /share/dld/ // 查看某个目录的大小 du --max-depth=1 -h ./ // 查看一级目录的大小 top -b -n 1 // 查看CPU,内存 top里显示的所有的cpu加起来的使用率,你的机子是多核吧,你运行top后按大键盘1看看,可以显示每个cpu的使用率, 从系统文件得到系统信息 pid: /proc/num cmd: /proc/xxx/cmdline task: /proc/xxx/task status: /proc/xxx/status : short_cmd | state | ppid | time ...: route: /proc/net/route netstat: /proc/net/tcp uid/gid: stat("/proc/xxx", &sb) getpwuid(uid)
重定向
0输入 1输出 2错误 ls >/dev/null 2>&1 // ls的标准输出不显示,标准错误同标准输出一样处理 cmd < file // file作为cmd的输入 cmd 2>> file // 把 stderr 重定向到 file 文件中(追加) cmd 1>file // 把标准输出重定向到文件。 1> 等同于 >, 0< == < echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward // 是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案 cmd < inputFile > outputFile // cmd < &m // 把文件描述符m作为标准输入
常用命令
find . -type d -name "*.svn"|xargs rm -rf find . -name "*.sh" -exec chmod +x {} \; find . -ctime 1 // 一天内新增的目录或档案 find . -newer .bashrc // 比 .bashrc 还要新的档案 find . -user test // 拥有者为 test 的档案 find | grep "mux" // 文件名含有mux的 find | xargs grep "mux" // 文件内容含有... find | wc -l // 统计行数,即文件个数 tar zxvf xxx.tar.gz -C newDir // -C:在新目录中解压; -z zip; -x extract; -v verbose; -f archFile tar zxmvf openssl-1.0.1e.tar.gz // 可以用 -m参数来把文件的时间(modify time)设置为当前系统的时间 或者解压后修改每个文件的时间 find . -exec touch -am '{}' \; tar zcvf SMBIOS.tar.gz SMBIOS/ // 压缩 : -c creat/compansion tar jxvf FileName.tar.bz2 // 解压bz2 : -j tar jcvf FileName.tar.bz2 DirName tar tvf xxx.tar.gz // 查看包里的内容 档案与目录管理: ls, cp, rm, mv, basename, dirname, rm -rf XXX // 删除以及子目录 ll -trh // t=time, r=reverse, h=human ll | grep "^d" // 查看目录,查看文件 grep "^-" basename /etc/fstab // fstab dirname /etc/fstab // /etc mkdir -p XXXdir; touch XXXfile // 创建目录(-p 存在不创建)以及文件 档案与目录权限: chown, chmod, umask, chattr, lsattr, chmod -R 777 XXX // -R: 子目录也 r=4, w=2, x=1; Usr/Group/Other/All ; // 对于目录, r=列出文件, w=增删文件, x=进入目录 ls -l /usr/bin/passwd -rwsr-xr-x // 以lidanding用户进入linux, 在执行时具有root权限 ; 若无x属性,则为大S suid = 4, guid = 2; Set UID ( SUID ) 的主要功能是在『某个档案执行的期间具有档案拥有者的权限』 具有 sticky bit 属性的该”目录”下的档案,其档案或目录只有档案拥有者及 root 才有权力删除! 755 + sticky bit = chmod 1755 file // sticky == 1 文件属性:只能添加,不可修改。。。 +i // 文件不可改变 lsattr ../showCmd.c // ------------- ../showCmd.c sudo chattr +i ../showCmd.c lsattr ../showCmd.c // ----i-------- ../showCmd.c sudo rm -rf ../showCmd.c // rm: cannot remove `../showCmd.c': Operation not permitted 文件中字符替换 替换一个文件: cat file|sed 's/old/new/g' > file2 批量替换: sed -i "s/oldString/newString/g" `grep oldString -rl /path` grep oldString -rl /path | xargs sed -i "s/oldString/newString/g" window,linux文件转换(win: /r/n == unix: /n, so need to del /r ) 回车(return to head)== \r == ^M ==CR == 0D 换行(new line) == \n == ^J ==LF == 0A 在linux上检查window文件是否非法: cat -v filename // cat -A winFile :set ff=unix // 用vi来查看 文件转换win--->unix dos2unix winFile unixFile :%s/^m//g // 用vi来删除 文件查看: cat, tac, more, less, head, tail, nl, od, wc -l file // -l 行数 -w 字数 -c 字符 cut -b5-9 file // 输出文件的5-9行 echo "a b c" | cut -d' ' -f 2 // -d 分隔符 -f 第几个域 结果:bc cat >> log.txt << ding // 在log.txt中通过命令行输入,以ding结束,否则以ctrl+D结束 less xxx.c // 可上下翻页,可/Half 按 n 查找 nl xxx.c // == cat -n 显示行号 sudo od core-CLI-759-1331002286 // 查看二进制文件 查找文件或目录: which, whereis, locate, find, locate dld // 记录在数据库文件中,所以先要同步 $ sudo updatedb whereis -b ls // 也是数据库,只找到执行档? which ls // 根据 PATH, 只找执行档 # lsb_release -a // 查看是什么linux系统以及版本 == cat /etc/issue # uname -a // 查看处理器,硬件平台等 # file /bin/ls // 查看文件属性,文件类型 type -a pwd // 查看命令类型,是否是shell builtin # getconf LONG_BIT // 查看系统的位数 cd /media/XXX // enter linux CD 多命令处理 find -type f | xargs dos2unix // 批量转换 tar lastfile.tar.gz `find . -mtime 1 -type f -print` // 将 `命令执行的结果` 当做参数 ls -l && pwd // first is ok, then exec second cp 1.txt 2.txt || echo "fail to cp 1 to 2" // first is fail, then second
文字文本处理
正则表达式 // js中运用:用户名只能: 字母 数字 _ () var usern = /^[a-zA-Z0-9_\(\)]{1,}$/; !username.match(usern) ^...$ // ^开头 $结尾 . 点为任意字符数字 ^$ 空行 [Aa]\{2, 4\} // A或a 出现2到4次 [^0-9\$] // ^在这里表示非,非数字或美元标识, [Dd|ld]\. // Dld. dld. 以一个句点和两个数字开始 ^\.[0-9][0-9] 至少一个小写字母 [a-z][a-z]* 日期格式d d - m m - y y y y [0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\} 以t h e开头行 ^[the] 包含m a y大写或小写字母的行 [mayMAY] 匹配任意行 [^.*$] sed :以行为单位,处理字串的增,删,改 sed [-nefr] [动作] 文件 // 动作:del, read, write, quit, print, TLINE=`sed -n '/^exit 0$/=' $0` // =行数 `反引号` $0这个表示脚本文件 sed "1,${TLINE}d" $0 >"${TMP_PATH}/wiucs.tar.gz" // d删除 sed -n '1,$p' a.txt // 打印1到最后一行;$表示最后一行 sed -n -e '/\$/'p -e '/\$/=' a.txt // 打印最后一行,以及它的行号; =表示行数;-e 多个条件 sed -i "s|\.\./wiucs-cvt|/opt/wiucs-cvt|" webmCvtServer.js awk :以行为一次处理单位,以字段为处理单元,适用于数据库表 awk '条件类型1{动作1} 条件类型2{动作2}' filename awk '{print $0}' data.txt // 打印 $0 == 所有域,$2 == 第二列 awk '{if($1~/34/) print $0}' data.txt // ' { if() print } ' awk '$2 == "dld" {print $0}' data.txt // ' == {print} ' awk 'END {print NR}' data.txt // NR == 行个数 NF == 域个数 awk -F/ '{print $NF}' // 当前目录名字,-F 设置域分隔符 grep :以行为单位,提取行中的字符串 grep [-acinv] '搜寻字符串' filename grep -c "48" data.txt // count: data.txt中有几行包含48 grep -n "48" data.txt // num: 打印出行号以及行 grep -v "48" data.txt // 打印出不包含的行 grep -E '1|73' data.txt //扩展模式,正则表达式 查找含有1或者73的行 ll |grep '^d' // 仅仅查询目录, grep '^[^d]' 查询非目录 grep -r sys_getenv * // grep 根据文件的内容查找
shell
shell函数 NAME="aa bb" functionA(){ // echo $1 // 这里的$1是函数的参数 echo $2 // 这里的$2是函数的参数 } functionA $NAME $1 // 这里的$1的是脚本的参数,结果: aa \n bb functionA "$NAME" $1 // 加引号后作为整体传入参数,结果: aa bb \n cc ./funcA cc : 结果如上 shell脚本做成命令 chmod +x xxx.js sh xxx.js stop // 执行脚本 cd /usr/bin ; ln -s xxx.sh wiucs // 软链接成命令 wicus stop // 执行命令 语法 num=2 echo "this is ${num}nd" // 结果:# this is 2nd,要带括号,否则不认得numnd echo '$SHELL' = echo \$SHELL // 输出为 $SHELL, echo "$AA" == echo $AA // 输出为AA的值 [ -x "file" ] || { echo "can't be exe"; exit 1; } // -n 非空串 -z 空串 -x可执行 -f 文件 [ "$var" = "$var2" ] [ $# -lt 3 ] // 等于, if ...; then // 用分号代表括号,简写elif,倒序esac, 结束done,列举in 位置变量 : $? 检查脚本返回的状态; $0 脚本的名字; $1 第一个参数; $* 所有的参数 $# 参数的个数; $$ processID 常用 USER='id -u' // 用户的id, root == 0. `这个不是单引号,是左上角的那个反引号` read -p "yes or no?" ANSWER // echo $ANSSER
磁盘管理: 分区 fdisk --> 格式化 mke2fs --> 挂载 mount
fdisk -l // 直接查看分区情况
fdisk 磁盘 // enter
m // 帮助 manual
p // 查看 print
系统最多支持4个主分区,为解决分区不够的问题,又产生了扩展分区(extended)的概念。
这样,系统最多可以有3个主分区,一个扩展分区。在扩展分区中,又可以再分为多个逻辑分区,能从5分到16。
mke2fs /dev/fd0 // 格式化软盘为ext2:linux标准档案系统,包括inode table(档案的属性以及内容的指针),block area(档案的内容)
-j // ext3
-b -i // 修改 block, inode 大小
-c -L // 检查, 标签
e2label 分区 label
mount -t ext2 /dev/sdb /home // 挂载 参数 谁 挂在哪里
mount -t nfs -o nolock,rsize=1024,wsize=1024 XXXIP:/share /home/ding // 把网络上其他用户的共享文件夹,挂载到本地文件夹
mount //IP/winFolder /linux/folder -o username=wh1103028,passwd=wh118991! // 把window下的文件夹,挂载到linux下。
cat /etc/fstab // 设定开机时即挂载的方式 # <file system> <mount point> <type> <options> <dump> <pass>
写到 fstab(smbfs == cifs) : //IP/VOIP /home/.../voip cifs defaults,auto,username=admin,passwd=wh1103028! 0 0
-a -l -h -V // 挂fstab中的, 显示目前挂的 , 帮助, 版本
mount -o remount,rw / // 根目录重新挂载为读写
unmount /dev/sda // if 强制,退出目录后执行,卸载后才能把磁盘移走
切割与格式化硬盘:分区fdisk, 格式化mke2fs, e2label, mknod,
检查硬盘坏轨与数据同步化写入:磁盘检查fsck, badblocks, sync,
关于软盘开机片: 启动mkbootdisk, 低格fdformat,
虚拟内存 Swap: swap partition, swap file, dd, mkswap, swapon, swapoff,
VI
Vi有三种基本的工作模式:指令模式、文本输入模式、行末模式。 指令模式(Command Mode) 输入 a、i、o >>> 文本输入模式(Input Mode) <<<按ESC进入 指令模式(Command Mode) 输入 : 冒号>>> 末行模式(Last line Mode) <<<指令错误 指令模式 光标 : 光标移动同方向键 ( h 左 j 下 k 上 l 右) ; 第一列的上,中,下(H M L) 命令: x(删除当前光标字符) / X(删除光标前的字符) d(删除一行) / D(删除一行中从光标开始后面的字符) i(光标前添加字符) / I (行首插入) a(光标后面添加字符) / A(行尾添加) o(下方插入空行) / O(上方) 末行模式 显示行号: :set nu 退出: :wq :q! (不保存) :x 查询: /hi (查找hi) n(顺序找下一个) / N(反序) 替换: 复制: 指令模式下: 复制3行/粘贴:3yy/p; 复制部分:v --->l------>y, p 末行模式下: 1, 3 co 5 //1到3行复制到第五行; 命令:co, m, d, // copy, move, delete 指令+末行 : 用ma,mb,mc在指令模式下做标志, 'a, 'b m 'c // 把a,b标记之间的行复制到c处 多个文件之间的复制 vi -o 1.sh 2.sh 或者 :sp 2.sh // ctrl + ww == ^ww, 进行切换; sp == split
linux bin文件的制作: bin = install.sh(安装脚本) + xxx.tar.gz(安装文件)
cat install.sh xxx.tar.gz > yyy.bin (因此,bin中的install.sh需要把它后面的二进制数据恢复成xxx.tar.gz,然后执行安装过程)
sed -n -e '1,/^exit 0$/!p' $0 > "${dir_tmp}/xxx.tar.gz" 2>/dev/null //去掉第一行到"exit 0"间的数据,后面的数据保存为xxx.tar.gz