我应该在shell登录脚本或单独的程序中放置复杂的功能吗?

时间:2009-03-27 19:40:37

标签: bash login

我之前在 .profile 中保存了一些简单的函数,但我决定将它们放在Perl脚本中并为Perl脚本添加别名。我觉得这是一个坏主意,但Perl中的功能看起来比/ bash更好,因为它相当复杂(涉及浮点数学等)。

是否有任何最佳实践用于登录脚本和/或放在PATH变量中的函数(涉及安全性和系统稳定性问题)?您是否在登录脚本之外分发复杂任务的功能,或者您是否拥有单一的登录脚本?

我想这可以归结为一个关于登录脚本重构有效性的问题,以及它是否有效通常如何完成。

3 个答案:

答案 0 :(得分:2)

我个人有一个脚本目录〜/ .bin,将其添加到~/.profile中的PATH,并将所有个人脚本保存在那里。我有bashlib,其中包含我所有其他脚本和~/.bashrc,其中包含我的所有便利功能。

我的~/.profile只包含我需要定义的环境变量(如PATH),而我的~/.bashrc包含shell初始化和一些过于简单的函数/别名,无法以脚本的形式放入

链接显示我如何设置这些文件。

顺便提一下,请参考 http://mywiki.wooledge.org/DotFiles,了解shell初始化的确切方式;什么类型的东西进入哪些文件。

答案 1 :(得分:1)

我有一个复杂的结构化配置文件 - 使用了大量脚本。主要问题是在使用它的所有不同环境中引导系统 - Solaris,Linux(misc h / w),HP-UX,AIX ......

我使用Korn shell - 但这些原则适用于bash(并且它适用于bash):

#!/bin/ksh
#
#   @(#)$Id: profile,v 6.8 2007/09/24 18:20:26 jleffler Exp $
#
#   Generic profile for Jonathan Leffler (JL)
#
#   Copyright (C) JLSS 1989-93,1995-99,2002,2005,2007

#TABSTOP=4

# Set machine-specific environment
mc=`uname -n`
if [ -r $HOME/.$mc ]
then
    . $HOME/.$mc
fi
unset mc

# Set basic environment
: ${INFORMIXDIR:=/usr/informix}         ; export INFORMIXDIR
: ${REAL_HOME:=$HOME}                   ; export REAL_HOME

# Machine-configurable PATH setting
for mcsetpath in ${REAL_HOME}/bin/mcsetpath ${HOME}/bin/mcsetpath
do
    if [ -r $mcsetpath ]
    then
        . $mcsetpath                    # Set PATH
        break;
    fi
done
unset mcsetpath

. libpath                               # Set LD_LIBRARY_PATH
. ttyset                                # Set STTY values
. kshrc                                 # Set KSH environment
. cdpath                                # Set CDPATH
. exinit                                # Set EXINIT
. termset                               # Set TERM type
. ixenviron                             # Set INFORMIX environment
. ccenviron                             # Set ClearCase environment
. setprompt                             # Set prompt
. manpath                               # Set MANPATH

umask 022

# Set group-specific environment
group=`id | sed 's/.* gid=[0-9]*(\([^)]*\)).*/\1/'`
if [ -f "$REAL_HOME/.$group" ]
then
    . $REAL_HOME/.$group
fi

# Set user-specific environment -- assume LOGNAME or USER set OK
# Beware Linux: by default, username = group name so things get done twice!
: ${LOGNAME:=${USER:-jleffler}}
export LOGNAME
if [ "$group" != "$LOGNAME" ] && [ -f "$REAL_HOME/.$LOGNAME" ]
then
    . $REAL_HOME/.$LOGNAME
else
    cd
    case "$-" in
    *c*)    : OK;;
    *)      echo "User $LOGNAME logged in to `pwd` at `date`";;
    esac
    trap "clear; exit 0" 0
fi
unset group

答案 2 :(得分:1)

这完全取决于您希望这些函数具有的范围,以及您希望它们如何与系统的其余部分进行交互。您可以将它们放在/ usr / local / bin中(使其可供所有人使用),或者将它们放入一个特殊的启动脚本中,您只需要(明确地)在需要时调用它们。

在确定如何确定范围之前,没有“正确的答案”,然后正确的答案是“将它们放在能够为您提供所需范围的地方。”