sh/bash/dash/ksh/zsh等Shell脚本
-
bioldex
- 帖子: 15
- 注册时间: 2009-09-14 16:32
#1
帖子
由 bioldex » 2009-09-14 16:46
我现在有一个小小的脚本需求,就是调用终端后,进入指定的目录后(在弹出的终端中自动切换到指定的目录下),同时自动地在终端中显示目录中的文件列表。
为此,我如下编写,但是当把它保存为可执行的脚本后,用鼠标点击执行,发现并不能弹出终端,当然也就不能在弹出的终端中切换到指定目录,同时显示其文件列表了。请大家指点一下应该如何编写才能实现阿。
代码: 全选
#!/bin/sh
set -e
BINDIR=/usr/local/toys
if [ $# -lt 1 ] ; then
echo "系统自动切换到指定目录,当前目录下的文件或程序有:"
cd ${BINDIR}
ls ${BINDIR}
fi
-
t3swing
- 帖子: 1028
- 注册时间: 2008-11-01 21:42
- 来自: 树下板凳
#2
帖子
由 t3swing » 2009-09-14 17:00
gnome-terminal;cd /usr/local/toys;ls
没看到你调终端, 用bash吧,不要默认sh
民族的脊梁,是踏实做事的人,非只知道骂街的泼妇。
-
bioldex
- 帖子: 15
- 注册时间: 2009-09-14 16:32
#3
帖子
由 bioldex » 2009-09-14 18:19
调用终端使之弹出后,如何在弹出的终端中执行目录切换,并显示目录中的列表呢?
下面的代码
代码: 全选
#!/bin/bash
set -e
BINDIR=/usr/local/toys
if [ $# -lt 1 ] ; then
exec xterm;
echo "系统自动切换到指定目录,当前目录下的文件或程序有:"
cd ${BINDIR}
ls ${BINDIR}
fi
终端可以弹出,但是cd 和ls命令不能在弹出的终端中执行并显示结果。请问,又该如何修改呢?
-
c\nc
- 帖子: 231
- 注册时间: 2007-12-25 12:51
#4
帖子
由 c\nc » 2009-09-14 18:42
这个算不?
代码: 全选
xterm -hold -e 'cd /opt;ls -l'
-
bioldex
- 帖子: 15
- 注册时间: 2009-09-14 16:32
#5
帖子
由 bioldex » 2009-09-14 19:46
根据
cnc的提示,现修改的代码如下:
代码: 全选
#!/bin/bash
set -e
BINDIR=/usr/local/toys
if [ $# -lt 1 ] ; then
exec xterm -hold -e "cd '${BINDIR}';ls";
echo "系统自动切换到指定程序目录,您可直接键入下列命令执行数据分析:"
exit 1
fi
这个代码现在可在弹出的终端中,执行进入目录和显示指目录中的文件列表这两项功能,但是不能在弹出的终端中执行echo语句。echo语句在我的设计中是需要的,因为它可在弹出终端显示必要的提示信息,便于进一步的操作。
下一步该如何修改呢?
而且,设计中还有一项功能,即执行上述功能后,能在该弹出终端中回退到命令提示符下,以便能根据和提示信息和显示结果,即刻在该弹出终端中输入相关命令,执行新的命令。
-
aerofox
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
#6
帖子
由 aerofox » 2009-09-14 20:14
全都放到 xterm 的 -e 参数后面。
-
bioldex
- 帖子: 15
- 注册时间: 2009-09-14 16:32
#7
帖子
由 bioldex » 2009-09-14 21:14
现在修改代码如下:
代码: 全选
#!/bin/bash
set -e
BINDIR=/usr/local/toys
if [ $# -lt 1 ] ; then
exec xterm -hold -e 'cd ${BINDIR};
echo "关于bioldex,您可以终端中键入下列命令进行了解和使用:";
ls';
exit 1
fi
现在echo语句可以了,不过在xterm下,这些汉字显示不全。而且这个代码不能使弹出的终端回退到命令提示符下。
如何优化和修改代码呢?
-
aerofox
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
#8
帖子
由 aerofox » 2009-09-14 23:44
试试把 xterm 改为 urxvt(需安装相应的软件包)。
-
aerofox
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
#9
帖子
由 aerofox » 2009-09-15 6:22
看看下面这个能命中楼主的需求吗
代码: 全选
gnome-terminal --working-directory $BINDIR -x sh -c "echo 关于bioldex,您可以终端中键入下列命令进行了解和使用:; ls; exec bash"
另一个做法是这样:
代码: 全选
cat > ~/.bioldexrc <<!
. ~/.bashrc
BINDIR=/usr/local/toys
cd $BINDIR
echo "关于bioldex,您可以终端中键入下列命令进行了解和使用:"
ls
!
gnome-terminal -x bash --rcfile ~/.bioldexrc
-
bioldex
- 帖子: 15
- 注册时间: 2009-09-14 16:32
#10
帖子
由 bioldex » 2009-09-15 9:28
感谢提示,现在修改的代码如下,基本满足要求,但光标不会闪动,而且需要解决汉字的显示问题:
代码: 全选
#!/bin/bash
set -e
BINDIR=/usr/local/toys
if [ $# -lt 1 ] ; then
cd ${BINDIR}
exec xterm -hold -e 'echo "系统自动切换到指定程序目录,您可直接键入下列命令进行使用和了解";
ls;
exec bash;'
fi
不过,上述代码中的xterm如果修改为gnome-terminal或xfce4-terminal,那么就不能弹出终端。不知为何?
另外,如果使用
代码: 全选
#!/bin/bash
cat > ~/.bioldexrc <<!
. ~/.bashrc
BINDIR=/usr/local/toys
cd $BINDIR
echo "关于bioldex,您可以终端中键入下列命令进行了解和使用:"
ls
!
xfce4-terminal -x bash --rcfile ~/.bioldexrc
一方面,弹出终端不能显示指定目录中的文件列表,另一方面也不能自动切换到指定目录。
-
bioldex
- 帖子: 15
- 注册时间: 2009-09-14 16:32
#11
帖子
由 bioldex » 2009-09-15 10:07
现在得到的结果,下面的命令代码,可以较好地满足要求:
代码: 全选
#!/bin/bash
BINDIR=/usr/local/toys
TEXT="关于bioldex,您可以终端中键入下列命令进行了解和使用"
cd $BINDIR
xfce4-terminal --working-directory $BINDIR -x sh -c "echo $TEXT;
ls;
exec bash"
不过,弹出的终端窗口大小不能根据显示的内容进行自动调整。如果要使弹出的终端窗口能自动调整大小,该加上什么代码呢?
-
aerofox
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
#12
帖子
由 aerofox » 2009-09-15 12:17
不过,上述代码中的xterm如果修改为gnome-terminal或xfce4-terminal,那么就不能弹出终端。不知为何?
gnome-terminal 中要执行一条命令,如果命令中还带参数,那么用 -x 参数,用 -e 参数就会有问题。另外,gnome-terminal 不支持 -hold,其实,因为你最后要进入交互式的 bash,没必要加 -hold。
那个 --rcfile 的例子,我是试过的,没有问题。但我用的是 gnome-terminal,我不想再装个 xfce4-terminal 试了,如果你对这个用法感兴趣,就不要盲目照搬,先看看 man,它们支持的参数是不是一样。
不过,弹出的终端窗口大小不能根据显示的内容进行自动调整。如果要使弹出的终端窗口能自动调整大小,该加上什么代码呢?
根据哪个显示内容呢?如果是 ls 的结果,ls 命令本身会根据窗口大小来调整输出,因而没有必要调整宽度吧。如果说 echo 的输出,完全可以事先计算出窗口宽度。至于窗口高度,既然还要交互式地执行用户的命令,没必要弄得太小,而太大也可能不好看,所以就弄个看着舒服的值就行了,只要有滚动条,什么都好办。
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#13
帖子
由 eexpress » 2009-09-15 12:21
窗口,看-geometry参数。--help看
xterm看man
● 鸣学
-
bioldex
- 帖子: 15
- 注册时间: 2009-09-14 16:32
#14
帖子
由 bioldex » 2009-09-17 8:32
呵呵,谢谢很好的提示,很好地帮了我一把。看来,Linux下需要好好把玩才行。