请教一个帖子的问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
Jr.z
帖子: 19
注册时间: 2012-02-13 10:58

请教一个帖子的问题

#1

帖子 Jr.z » 2012-03-10 11:00

源地址:http://www.linuxsir.org/bbs/showthread. ... adid=98437
第五楼

我不明白为什么要两次用sed:
sed -e '1,/BIGIN SELFEXTR/d' $0 |sed -e '1,/BIGIN SELFEXTR/d' > /tmp/self/test.tar.gz
上次由 Jr.z 在 2012-03-10 11:43,总共编辑 1 次。
头像
wjchen
帖子: 583
注册时间: 2011-05-02 19:08
系统: ubuntu 12.04

Re: 请教一个帖子的问题

#2

帖子 wjchen » 2012-03-10 11:42

帖子地址不完整…… :em06
Jr.z
帖子: 19
注册时间: 2012-02-13 10:58

Re: 请教一个帖子的问题

#3

帖子 Jr.z » 2012-03-10 11:48

wjchen 写了:帖子地址不完整…… :em06
感谢提醒,这次可以了
头像
wjchen
帖子: 583
注册时间: 2011-05-02 19:08
系统: ubuntu 12.04

Re: 请教一个帖子的问题

#4

帖子 wjchen » 2012-03-10 12:53

self.bin由两部分组成:

代码: 全选

#!/bin/bash
[ -d /tmp/self ]|| mkdir -p /tmp/self
sed -e '1,/BIGIN SELFEXTR/d' $0 |sed -e '1,/BIGIN SELFEXTR/d' > /tmp/self/test.tar.gz
( cd /tmp/self ;
 tar xvfz test.tar.gz;
 . exsample1
)
exit 0
#BIGIN SELFEXTR
exsam.tar.gz的内容(一些两进制乱码)
第一次sed删除self.bin中的1~3行的内容(因为第三行包含BIGIN SELFEXTR),第二次sed删除4~9行的内容,剩下的就是exsam.tar.gz的内容,再重定向到/tmp/self/test.tar.gz
Jr.z
帖子: 19
注册时间: 2012-02-13 10:58

Re: 请教一个帖子的问题

#5

帖子 Jr.z » 2012-03-10 13:19

wjchen 写了:self.bin由两部分组成:

代码: 全选

#!/bin/bash
[ -d /tmp/self ]|| mkdir -p /tmp/self
sed -e '1,/BIGIN SELFEXTR/d' $0 |sed -e '1,/BIGIN SELFEXTR/d' > /tmp/self/test.tar.gz
( cd /tmp/self ;
 tar xvfz test.tar.gz;
 . exsample1
)
exit 0
#BIGIN SELFEXTR
exsam.tar.gz的内容(一些两进制乱码)
第一次sed删除self.bin中的1~3行的内容(因为第三行包含BIGIN SELFEXTR),第二次sed删除4~9行的内容,剩下的就是exsam.tar.gz的内容,再重定向到/tmp/self/test.tar.gz

呵呵,谢谢,我忘了sed 里还有BIGIN SELFXTR
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 请教一个帖子的问题

#6

帖子 aerofox » 2012-03-10 18:31

其实只用一次也可以,把地址范围改为

代码: 全选

1,/^#BEGIN SELFEXTR/
整个脚本可以改为:

代码: 全选

#!/bin/bash
mkdir -p /tmp/self   #有 -p 时,前面的判断可以不要
cd /tmp/self
sed -e '1,/^#BIGIN SELFEXTR/d' $0 | tar xvz 
. exsample1
exit 0
#BIGIN SELFEXTR
exsam.tar.gz的内容(一些两进制乱码)
Jr.z
帖子: 19
注册时间: 2012-02-13 10:58

Re: 请教一个帖子的问题

#7

帖子 Jr.z » 2012-03-10 21:12

aerofox 写了:其实只用一次也可以,把地址范围改为

代码: 全选

1,/^#BEGIN SELFEXTR/
整个脚本可以改为:

代码: 全选

#!/bin/bash
mkdir -p /tmp/self   #有 -p 时,前面的判断可以不要
cd /tmp/self
sed -e '1,/^#BIGIN SELFEXTR/d' $0 | tar xvz 
. exsample1
exit 0
#BIGIN SELFEXTR
exsam.tar.gz的内容(一些两进制乱码)
恩,的确用兄台的方法用一次sed就行了
不过兄台没有自己运行过吧?
你直接通过管道传递给tar的方法是行不通的,用以下代码就知道:

代码: 全选

cat example.tar.gz | tar xvfz 
还有,就是兄台没领悟subshell
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 请教一个帖子的问题

#8

帖子 aerofox » 2012-03-10 21:49

管道为什么不行,我的tar命令中没有那个 f 噢。
个人感觉在这里没必要用 subshell,所以没用。
Jr.z
帖子: 19
注册时间: 2012-02-13 10:58

Re: 请教一个帖子的问题

#9

帖子 Jr.z » 2012-03-10 22:59

aerofox 写了:管道为什么不行,我的tar命令中没有那个 f 噢。
个人感觉在这里没必要用 subshell,所以没用。
:em06 嘿嘿,是我错了,主要是用惯了那个f,随手加了

至于subshell ,单纯从这个脚本来说没必要,但是兄台看看我引用的那个帖子就知道了,原帖子中subshell的必要性
当然,这还是看个人爱好,哈哈
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 请教一个帖子的问题

#10

帖子 aerofox » 2012-03-11 10:10

老实说,我没有看出原贴中有必要使用 subshell。
在 subshell 返回后立即执行了 exit 命令,因而靠 subshell 保护当前 shell 的环境不被修改没有什么意义。
Jr.z
帖子: 19
注册时间: 2012-02-13 10:58

Re: 请教一个帖子的问题

#11

帖子 Jr.z » 2012-03-11 14:21

aerofox 写了:老实说,我没有看出原贴中有必要使用 subshell。
在 subshell 返回后立即执行了 exit 命令,因而靠 subshell 保护当前 shell 的环境不被修改没有什么意义。
但是如果发现自己在安装完或者执行完一个命令后发现自己当前目录变了,
而你在原来的目录下还有其他要做的事,然后你自己再cd回去?
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 请教一个帖子的问题

#12

帖子 aerofox » 2012-03-11 20:49

你要写的是一个脚本程序(里面实际上打包了数据),用户在执行这个脚本程序时实际上就启动了一个 subshell(除非他非得要用 . 或者 source 命令执行,那是他蛋疼),在这个 subshell 中再怎么改变工作目录,exit 0 时就全没了,恢复到用户 shell 的环境。
Jr.z
帖子: 19
注册时间: 2012-02-13 10:58

Re: 请教一个帖子的问题

#13

帖子 Jr.z » 2012-03-11 21:47

aerofox 写了:你要写的是一个脚本程序(里面实际上打包了数据),用户在执行这个脚本程序时实际上就启动了一个 subshell(除非他非得要用 . 或者 source 命令执行,那是他蛋疼),在这个 subshell 中再怎么改变工作目录,exit 0 时就全没了,恢复到用户 shell 的环境。
:em06 实验过了,你又一次赢了
哈哈,受教了
回复