请问如何编写shell脚本调用终端呢?

sh/bash/dash/ksh/zsh等Shell脚本
回复
bioldex
帖子: 15
注册时间: 2009-09-14 16:32

请问如何编写shell脚本调用终端呢?

#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
来自: 树下板凳

Re: 请问如何编写shell脚本调用终端呢?

#2

帖子 t3swing » 2009-09-14 17:00

gnome-terminal;cd /usr/local/toys;ls
没看到你调终端, 用bash吧,不要默认sh
民族的脊梁,是踏实做事的人,非只知道骂街的泼妇。
bioldex
帖子: 15
注册时间: 2009-09-14 16:32

Re: 请问如何编写shell脚本调用终端呢?

#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

Re: 请问如何编写shell脚本调用终端呢?

#4

帖子 c\nc » 2009-09-14 18:42

这个算不?

代码: 全选

xterm -hold -e 'cd /opt;ls -l'
bioldex
帖子: 15
注册时间: 2009-09-14 16:32

Re: 请问如何编写shell脚本调用终端呢?

#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

Re: 请问如何编写shell脚本调用终端呢?

#6

帖子 aerofox » 2009-09-14 20:14

全都放到 xterm 的 -e 参数后面。
bioldex
帖子: 15
注册时间: 2009-09-14 16:32

Re: 请问如何编写shell脚本调用终端呢?

#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

Re: 请问如何编写shell脚本调用终端呢?

#8

帖子 aerofox » 2009-09-14 23:44

试试把 xterm 改为 urxvt(需安装相应的软件包)。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 请问如何编写shell脚本调用终端呢?

#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

Re: 请问如何编写shell脚本调用终端呢?

#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

Re: 请问如何编写shell脚本调用终端呢?

#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

Re: 请问如何编写shell脚本调用终端呢?

#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
来自: 长沙

Re: 请问如何编写shell脚本调用终端呢?

#13

帖子 eexpress » 2009-09-15 12:21

窗口,看-geometry参数。--help看
xterm看man
● 鸣学
bioldex
帖子: 15
注册时间: 2009-09-14 16:32

Re: 请问如何编写shell脚本调用终端呢?

#14

帖子 bioldex » 2009-09-17 8:32

呵呵,谢谢很好的提示,很好地帮了我一把。看来,Linux下需要好好把玩才行。
回复