題 如何編寫一個可以在csh和bash中運行的setevn / export腳本?


在我的環境(RHEL)中,我有一堆用csh或bash編寫的腳本。

其中一些用於處理tomcat服務器。

我想在一個地方保留CATALINA_HOME和CATALINA_BASE的定義,這樣csh和bash腳本可以從一個文件中獲取變量。

我對bash更熟悉,並且對csh的接觸非常有限。所以對於bash腳本,我將做的是:

. ~/tomcat.settings

在tomcat.settings中,我會有

export CATALINA_HOME=/mnt/apps/tomcat/6.0.20/linux
export CATALINA_BASE=/home/app1/server

如何從csh中的同一文件中獲取資源?


4
2018-01-03 00:52


起源




答案:


不要試圖使兩個之間的相同腳本可移植 完全不同 砲彈。甚至sh和bash的兼容性也難以實現,並且那些使用相同的語法......(我甚至無法想像人們如何能夠首先站在csh中。)


像這樣編寫你的設置scriptlet:

test "$?BASH_VERSION" = "0" || eval 'setenv() { export "$1=$2"; }'

setenv CATALINA_HOME "/mnt/apps/tomcat/6.0.20/linux"
setenv CATALINA_BASE "/home/app1/server"

我在bash 4.2.20,tcsh 6.17和破折號0.5.7中對此進行了測試。


更合理的解決方案:

您可以將設置保留為純文本,如下所示:

  • ~/tomcat/catalina-home

    /mnt/apps/tomcat/6.0.20/linux
    
  • 你的bash腳本

    export CATALINA_HOME=$(< ~/tomcat/catalina-home)
    export CATALINA_BASE=$(< ~/tomcat/catalina-base)
    
  • 你的csh腳本

    setenv CATALINA_HOME "`cat ~/tomcat/catalina-home`"
    setenv CATALINA_BASE "`cat ~/tomcat/catalina-base`"
    

您可以編寫一個用於設置環境的包裝器:

  • /usr/bin/tcat

    #!/bin/sh
    # you can use any, *any* language for this one
    export CATALINA_HOME=/mnt/apps/tomcat/6.0.20/linux
    export CATALINA_BASE=/home/app1/server
    exec "$@"
    
  • 如果你有 myscript,你會像它一樣運行它 tcat myscript args args args

您可以通過設置包含原始數據和運行腳本的“env目錄”來組合上述兩種方法 丹伯恩斯坦 envdir 要么 Gerrit Pape的 chpst

  • echo“/mnt/apps/tomcat/6.0.20/linux”>〜/ tomcat-envdir / CATALINA_HOME
    echo“/ home / app1 / server”>〜/ tomcat-envdir / CATALINA_BASE
    envdir~ / tomcat-envdir / myscript
    chpst -e~ / tomcat-envdir / myscript

7
2018-01-03 01:20