[问题]如何让一个后台程序(脚本)在其退出后不打印退出消息?

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
cnkilior
论坛版主
帖子: 4981
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

[问题]如何让一个后台程序(脚本)在其退出后不打印退出消息?

#1

帖子 cnkilior » 2008-10-18 14:20

一般来说,无论后台程序是否自己结束还是被kill都会在控制台上打印推出消息。(?)
--
但是我观察脚本《俄罗斯方块》,他有两个进程,一个在前台获得输入,一个在后台负责显示,无论是被C-c还是kill还是满足游戏结束条件,后台和前台程序都会结束,奇怪的事出来了,后台程序并没有打印退出消息,而是干净的退出了。

据查:它并没有使用重定向>。没有使用fg。stty也只用了2次,一次是获得当前tty设置,一次是重设tty。

---
它太长了,读了半天还不知道它是如何实现这个的!
头像
cnkilior
论坛版主
帖子: 4981
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

Re: [问题]如何让一个后台程序(脚本)在其退出后不打印退出消息?

#2

帖子 cnkilior » 2008-10-18 15:33

在sir看到一个想法,就实现一下。这个想法是:打印随机数,按任意键停止/再开始。

代码: 全选

#!/bin/sh

RunAskey()
{
    Stty=`stty -g`
    trap "MyExit $1" INT TERM
    i=0
    while `read -s -n 1 a`;do
	if [ $i == 0 ];then
	    kill -30 $1
	    i=1
	else
	    kill -31 $1
	    i=0
	fi
    done
}

Random()
{
    n=1
    trap "n=0" 30
    trap "n=1" 31
    echo -n "Creating Random Number...     "
    while `sleep 1`;do
	if [ $n == 1 ];then
	   echo -en \\b\\b\\b\\b\\b
	   printf %5d $RANDOM 
	else
	    :
	fi
    done
}

MyExit()
{
    kill $1
    stty $Stty
    exit 
}
if [ $# == 1 ]; then
    Random
else
    bash $0 -xx& 
    RunAskey $!
fi
这个脚本90%完美,但就是退出时不完美,会打印退出消息。就有这个想法。
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

Re: [问题]如何让一个后台程序(脚本)在其退出后不打印退出消息?

#3

帖子 xiooli » 2008-10-18 15:58

我的怎么没有退出消息?

代码: 全选

xiooli(~/桌面)╠♦ bash pt
Creating Random Number... 5743xiooli(~/桌面)╠☪
头像
cnkilior
论坛版主
帖子: 4981
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

Re: [问题]如何让一个后台程序(脚本)在其退出后不打印退出消息?

#4

帖子 cnkilior » 2008-10-18 16:07

??
奇怪了?
你这么运行的啊!

用./pt试试。。

--
你这样运行我还是有!


你有改过么?

你有特被设置过bash吗?除了你的PS1外?
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

Re: [问题]如何让一个后台程序(脚本)在其退出后不打印退出消息?

#5

帖子 xiooli » 2008-10-18 16:16

cnkilior 写了:??
奇怪了?
你这么运行的啊!

用./pt试试。。

--
你这样运行我还是有!


你有改过么?

你有特被设置过bash吗?除了你的PS1外?
算啦,把bashrc贡献出来吧:

代码: 全选

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# don't put duplicate lines in the history. See bash(1) for more options
export HISTCONTROL=ignoredups
# ... and ignore same sucessive entries.
export HISTCONTROL=ignoreboth

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# enable color support of ls and also add handy aliases
if [ "$TERM" != "dumb" ] && [ -x /usr/bin/dircolors ]; then
    eval "`dircolors -b`"
    alias ls='ls --color=auto'
    alias dir='ls --color=auto --format=vertical'
    alias vdir='ls --color=auto --format=long'
    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# some more ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'

# user-defined aliases
#alias rm='rm -vi'
#alias cp='cp -vi'
#alias mv='mv -vi'
alias clean='rm -f "#"* "."*~ *~ *.dvi *.aux *.log'
alias clr='clear'
alias agi='sudo apt-get install'
alias acs='sudo apt-cache search'
alias mna='man'

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

#颜色代码

export back_green="\[\033[01;42m\]"
export back_blue="\[\033[01;44m\]"
export back_brown="\[\033[01;41m\]"
export back_purple="\[\033[01;45m\]"

export black="\[\033[0;38;5;0m\]"
export red="\[\033[0;38;5;1m\]"
export green="\[\033[0;38;5;2m\]"
export yellow="\[\033[0;38;5;3m\]"
export blue="\[\033[0;38;5;4m\]"
export magenta="\[\033[0;38;5;55m\]"
export cyan="\[\033[0;38;5;6m\]"
export white="\[\033[00m\]"
export coldblue="\[\033[0;38;5;33m\]"
export smoothblue="\[\033[0;38;5;111m\]"
export iceblue="\[\033[0;38;5;45m\]"
export turqoise="\[\033[0;38;5;50m\]"
export smoothgreen="\[\033[0;38;5;42m\]"

#自定义函数

x () {  #解压

   if [ -f $1 ] ; then
      case $1 in
         *.tar.bz2)   tar xjf $1      ;;
         *.tar.gz)   tar xzf $1      ;;
         *.bz2)      bunzip2 $1      ;;
         *.rar)      rar x $1      ;;
         *.gz)      gunzip $1      ;;
         *.tar)      tar xf $1      ;;
         *.tbz2)      tar xjf $1      ;;
         *.tgz)      tar xzf $1      ;;
         *.zip)      unzip $1      ;;
         *.Z)      uncompress $1   ;;
         "")      没有输入文件名!   ;;
         *)      echo "'$1' 不能通过 x 解压" ;;
      esac
   else
      echo "'$1' 不是有效文件!"
   fi

}

pre_prompt () {

    if [ ${changed:-0} -eq 0 ];then
        PS1="${back_green}\u${white}(\w)${back_green}╠♦${white} "
        changed=1
    else
        PS1="${back_brown}\u${white}(\w)${back_brown}╠☪${white} "
        changed=0
    fi
}

unset PROMPT_COMMAND
PROMPT_COMMAND=pre_prompt



#彩色man page

export BROWSER=export PAGER="/usr/bin/less -s"
export BROWSER="$PAGER"
export LESS_TERMCAP_mb=$'\033[01;31m'
export LESS_TERMCAP_md=$'\033[01;31m'
export LESS_TERMCAP_me=$'\033[0m'
export LESS_TERMCAP_se=$'\033[0m'
export LESS_TERMCAP_so=$'\033[01;44m'
export LESS_TERMCAP_ue=$'\033[0m'
export LESS_TERMCAP_us=$'\033[01;32m'
头像
cnkilior
论坛版主
帖子: 4981
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

Re: [问题]如何让一个后台程序(脚本)在其退出后不打印退出消息?

#6

帖子 cnkilior » 2008-10-18 16:28

没有什么特别之处(当然你的脚本很好),除了export,alias,定义函数,就是运行其他脚本,关键是这个“PROMPT_COMMAND=pre_prompt”是什么意思?PROMPT_COMMAND变量是干什么的?
我这里是默认的“PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"'”

还有就是shopt -s checkwinsize
回复

回到 “Shell脚本”