java设置linuxshell变量执行脚本

本文介绍了一个用于Sybase数据库的停止脚本db.stop.sh的内容及执行方式。该脚本通过su命令切换到Sybase用户环境,并使用isql命令进行数据库操作,包括使用master数据库、触发检查点、关闭数据库等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


db.stop.sh

##db.stop.sh
su - sybase -c \"isql -Usa -P$SA_PWD -SlogDB\" << EOF
use master
go
checkpoint
go
shutdown SYB_BACKUP with nowait
go
shutdown with nowait
go
exit
EOF
sleep 60
echo "Database STOP done."


执行命令方法:

/**
	 * 执行本地命令并返回结果
	 * @param cmd 本地命令
	 * @param env 环境变量
	 * @param dir
	 * @return
	 * @throws IOException 
	 * @throws InterruptedException 
	 */
	static String exec(String cmd, String[] env, File dir) 
			throws IOException, InterruptedException{
		String res = "";
		int state = 0;
		byte[] buff = new byte[1024];
		int readLen = 0;
		InputStream stdIn = null;
		InputStream stdErr = null;
		
		try{			
			Runtime r = Runtime.getRuntime();
			Process p = r.exec(cmd, env, dir);			
			stdIn = p.getInputStream();
			stdErr = p.getErrorStream();
			state = p.waitFor();
			
			if(0==state){
				while(-1!=(readLen=stdIn.read(buff))){
					res = (new String(buff,0,readLen));
				}
				
				while(-1!=(readLen=stdErr.read(buff))){
					res = (new String(buff,0,readLen));
				}
			}else{
				res = "__ERROR__:"+state;
			}
		}finally{
			try{
				if(null!=stdIn) stdIn.close();
			}catch(Exception ex){				
			}
			
			try{
				if(null!=stdErr) stdErr.close();
			}catch(Exception ex){				
			}		
		}
		
		return res;
	}

测试类:

static void t5(){		
		try {
			String res = exec(
					"bash db.stop.sh", 
					new String[]{"SA_PWD=123456"}, 
					null);
			System.out.println(res);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}








<think>我们正在处理用户的问题:如何在Linux系统中使用Shell脚本配置Java环境变量。 根据用户提供的引用信息,我们可以总结出以下步骤: 1. 找到Java的安装路径(通常通过`find`命令或手动指定)。 2. 设置环境变量JAVA_HOME, PATH等)。 3. 将这些环境变量导出,使其在当前shell及子进程中可用。 4. 可以选择将设置写入配置文件(如~/.bashrc, ~/.profile, /etc/profile等)以便永久生效。 注意:设置环境变量的方式取决于使用的shell类型(登录shell、非登录shell等)以及希望设置的范围(当前用户还是所有用户)。 我们将编写一个Shell脚本,它需要完成以下任务: - 接收一个参数,即Java的安装目录(或者自动检测)。 - 设置JAVA_HOME为这个目录。 - 将$JAVA_HOME/bin添加到PATH中。 - 可以选择更新配置文件以实现永久设置。 但是,由于脚本执行的环境限制,直接通过脚本设置环境变量通常只会影响当前shell进程(除非在脚本中source配置文件)。因此,我们通常有两种方式: 1. 让脚本输出设置环境变量的命令,然后由用户执行eval或者重定向到配置文件。 2. 在脚本中直接修改配置文件(需要谨慎,避免重复添加)。 考虑到用户可能希望立即生效,我们可以设计脚本让用户选择是否写入配置文件,并提示用户执行source命令。 另外,引用[3]提到了一种设置方式:在配置文件中添加环境变量,然后通过source命令立即生效而不重启。 下面是一个示例脚本,它允许用户通过参数指定Java安装路径,或者自动检测(这里我们简化自动检测,实际中可能需要用户指定或者从已知路径查找)。 注意:由于不同系统可能使用不同的shell配置文件,我们这里以常见的bash为例,针对当前用户设置(写入~/.bashrc)。 步骤: 1. 检查是否提供了Java路径作为参数,如果没有,则尝试使用常见的路径或者通过find命令查找(但find命令可能返回多个结果,我们取第一个?最好让用户选择)。 2. 验证提供的路径是否包含bin/java执行文件。 3. 设置环境变量并导出。 4. 将环境变量设置写入~/.bashrc(如果用户选择永久设置)。 5. 提示用户source配置文件。 但是,由于在脚本中修改环境变量只能影响当前shell进程(子进程会继承,但父进程不会),所以脚本执行后,当前终端的环境变量不会改变(除非用source执行脚本)。因此,我们通常将设置命令写入配置文件,然后让用户重新登录或执行source。 因此,我们设计脚本如下: 方案1:脚本只负责修改配置文件,然后提示用户执行source命令。 方案2:脚本也可以直接输出设置环境变量的命令,让用户用eval执行(这样只对当前shell有效)。 这里我们采用方案1,并增加一个选项(是否写入配置文件)。 考虑到用户可能希望同时设置当前shell的环境变量,我们可以这样:先尝试设置当前shell(但这样只能影响当前shell进程,而不会影响父进程,所以如果用户希望立即在当前终端使用,必须用source执行脚本,或者用eval执行脚本输出的命令)。 因此,我们提供两种方式: 方式一:将设置命令写入配置文件(永久设置),并提示用户手动source或重新登录。 方式二:在脚本中直接输出设置环境变量的命令,并提示用户用eval执行(临时设置)。 但是,由于脚本执行时是在子shell中,所以无法直接修改父shell的环境变量。因此,我们只能通过让用户source脚本或者使用eval来设置当前shell。 这里我们采用一个折中:脚本可以同时支持两种方式,但为了简单,我们只做永久设置(写入配置文件),然后提示用户source。同时,我们也可以输出设置命令,让用户可以选择临时设置。 因此,我们编写脚本如下: 注意:我们假设用户使用bash。 脚本名:set_java_env.sh 内容: ```bash #!/bin/bash # 这个脚本用于设置Java环境变量 # 默认不自动写入配置文件,除非用户指定 AUTO_WRITE_TO_PROFILE=false JAVA_PATH="" # 解析参数 while [ $# -gt 0 ]; do case "$1" in -p|--path) JAVA_PATH="$2" shift 2 ;; -w|--write) AUTO_WRITE_TO_PROFILE=true shift ;; *) echo "未知参数: $1" exit 1 ;; esac done # 如果没有提供Java路径,尝试自动查找 if [ -z "$JAVA_PATH" ]; then # 尝试查找java命令的位置(注意:如果已经设置了PATH,可能找到的是旧版本) JAVA_CMD_PATH=$(which java 2>/dev/null) if [ -n "$JAVA_CMD_PATH" ]; then # 将java命令的路径转换为安装目录(通常java命令在bin目录下) JAVA_PATH=$(dirname $(dirname $(readlink -f $JAVA_CMD_PATH))) else # 如果找不到,尝试在常见路径中查找 common_paths=( /usr/lib/jvm /usr/java /opt/java ) for path in "${common_paths[@]}"; do if [ -d "$path" ]; then # 取第一个找到的目录(或者让用户选择?这里我们取第一个) JAVA_PATH="$path" break fi done fi fi # 如果还是找不到,提示用户输入 if [ -z "$JAVA_PATH" ]; then echo "无法自动找到Java安装路径,请手动指定路径。" exit 1 fi # 验证路径是否存在 if [ ! -d "$JAVA_PATH" ]; then echo "指定的Java路径不存在: $JAVA_PATH" exit 1 fi # 验证bin/java是否存在(可选,但推荐) if [ ! -f "$JAVA_PATH/bin/java" ]; then echo "警告:在$JAVA_PATH/bin下没有找到java执行文件。" fi # 设置环境变量 export JAVA_HOME=$JAVA_PATH export PATH=$JAVA_HOME/bin:$PATH # 输出设置信息 echo "已设置JAVA_HOME为: $JAVA_HOME" echo "已将$JAVA_HOME/bin添加到PATH中。" # 如果用户选择写入配置文件 if [ "$AUTO_WRITE_TO_PROFILE" = true ]; then # 写入~/.bashrc echo "写入配置文件 ~/.bashrc ..." echo "" >> ~/.bashrc echo "# 由set_java_env.sh脚本设置" >> ~/.bashrc echo "export JAVA_HOME=$JAVA_PATH" >> ~/.bashrc echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> ~/.bashrc echo "完成。请运行以下命令使配置立即生效:" echo "source ~/.bashrc" else # 如果不写入配置文件,则提示用户当前的设置只在当前shell有效,或者可以手动执行命令 echo "注意:当前设置只在当前shell会话中有效。" echo "要使设置永久生效,请重新运行脚本并添加 --write 参数,或者将以下行添加到您的配置文件中(如~/.bashrc):" echo "export JAVA_HOME=$JAVA_PATH" echo "export PATH=\$JAVA_HOME/bin:\$PATH" echo "然后运行: source ~/.bashrc" fi # 提示用户验证 echo "现在可以验证Java版本:" java -version ``` 注意:这个脚本在运行时,如果用户没有使用source执行(而是直接./set_java_env.sh),那么设置的环境变量JAVA_HOME和PATH)只会在脚本运行的子进程中有效,不会影响父shell。所以,如果用户希望设置当前shell的环境变量,必须使用source执行脚本(或者用. set_java_env.sh)。 因此,我们建议用户这样使用: 1. 临时设置(仅当前终端有效): source set_java_env.sh --path /path/to/java 2. 永久设置(写入配置文件): source set_java_env.sh --write --path /path/to/java 或者 ./set_java_env.sh --write --path /path/to/java # 但这样设置的环境变量不会立即在当前终端生效,需要再执行source ~/.bashrc 所以,我们最好在脚本中提示用户如何执行。 但是,由于用户可能直接运行脚本,我们可以在脚本中检查是否以source方式执行(通过检查$0是否等于bash?),但这种方法不可靠。因此,我们通过文档说明。 另外,自动查找Java路径可能不准确,特别是当系统中有多个Java版本时。因此,我们建议用户明确指定路径。 根据引用[2]和[3],设置环境变量后需要source配置文件(如~/.bashrc)来立即生效,而不需要重启系统。 因此,我们编写好脚本后,用户需要: 1. 将脚本保存为set_java_env.sh 2. 赋予执行权限:chmod +x set_java_env.sh 3. 执行(假设Java安装在/usr/lib/jvm/java-11-openjdk-amd64): source set_java_env.sh --path /usr/lib/jvm/java-11-openjdk-amd64 或者(永久设置) source set_java_env.sh --write --path /usr/lib/jvm/java-11-openjdk-amd64 注意:如果用户已经知道Java路径,也可以不指定--path,让脚本自动查找。 以上脚本是一个基础版本,实际使用中可能需要根据具体环境调整。 现在,我们按照用户要求生成相关问题:</think>### 在Linux中使用Shell脚本配置Java环境变量 以下是一个完整的Shell脚本解决方案,用于在Linux系统中配置Java环境变量(支持自动检测和手动指定路径): ```bash #!/bin/bash # set_java_env.sh - 自动配置Java环境变量 # 1. 自动检测Java安装路径 detect_java_path() { # 查找可能的Java安装路径 local java_paths=($(find /usr/lib/jvm /opt /usr/local -maxdepth 3 -name "java" -type f -executable 2>/dev/null | grep -E 'bin/java$' | sort -u)) if [ ${#java_paths[@]} -eq 0 ]; then echo "未检测到Java安装,请手动指定路径" return 1 fi # 显示可选项供用户选择 echo "检测到以下Java安装:" for i in "${!java_paths[@]}"; do dir=$(dirname "$(dirname "${java_paths[$i]}")") version=$("${java_paths[$i]}" -version 2>&1 | head -n 1) echo "$((i+1)). $dir → $version" done # 用户选择 read -p "请选择Java版本 (1-${#java_paths[@]}): " choice if [[ $choice =~ ^[0-9]+$ ]] && [ $choice -ge 1 ] && [ $choice -le ${#java_paths[@]} ]; then JAVA_HOME=$(dirname "$(dirname "${java_paths[$choice-1]}")") echo "已选择: $JAVA_HOME" return 0 else echo "无效选择" return 1 fi } # 2. 设置环境变量 set_java_vars() { local java_home=$1 # 验证路径有效性 if [ ! -f "$java_home/bin/java" ]; then echo "错误:$java_home 不是有效的Java安装路径" >&2 return 1 fi # 设置环境变量 export JAVA_HOME=$java_home export PATH=$JAVA_HOME/bin:$PATH # 永久化配置 (写入~/.bashrc) if ! grep -q "export JAVA_HOME=" ~/.bashrc; then echo -e "\n# Java环境配置" >> ~/.bashrc echo "export JAVA_HOME=$JAVA_HOME" >> ~/.bashrc echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc echo "配置已写入 ~/.bashrc" fi # 立即生效 (仅限当前会话) source ~/.bashrc >/dev/null 2>&1 echo "环境变量设置: JAVA_HOME=$JAVA_HOME" } # 3. 主执行逻辑 main() { if [ $# -eq 1 ]; then # 使用用户提供的路径 set_java_vars "$1" else # 自动检测路径 if detect_java_path; then set_java_vars "$JAVA_HOME" else echo "用法: $0 [Java安装路径]" echo "示例: $0 /usr/lib/jvm/java-11-openjdk-amd64" exit 1 fi fi # 验证配置 echo -e "\n验证Java版本:" java -version } # 执行主函数 main "$@" ``` ### 使用说明 1. **保存脚本**: ```bash nano set_java_env.sh # 复制上述内容保存 chmod +x set_java_env.sh ``` 2. **自动检测模式** (推荐): ```bash ./set_java_env.sh ``` 脚本会自动列出所有检测到的Java安装供您选择 3. **手动指定路径**: ```bash ./set_java_env.sh /path/to/java ``` 示例: ```bash ./set_java_env.sh /usr/lib/jvm/java-17-openjdk-amd64 ``` ### 工作原理 1. **路径检测**: - 搜索常见安装目录 (`/usr/lib/jvm`, `/opt`, `/usr/local`) - 显示检测到的Java版本供用户选择[^2] 2. **环境变量设置**: - 临时设置:立即在当前Shell会话生效 - 永久设置:写入`~/.bashrc`文件[^3] - 自动加载:执行`source ~/.bashrc`立即生效[^5] 3. **验证机制**: - 检查`java`可执行文件是否存在 - 输出Java版本验证配置结果 ### 注意事项 1. 脚本会修改`~/.bashrc`文件,首次执行会添加配置,后续执行不会重复添加 2. 新打开的终端会自动加载配置[^5] 3. 如需系统级配置(所有用户),可修改脚本写入`/etc/profile.d/java.sh` > **提示**:使用`source set_java_env.sh`执行可使环境变量在当前Shell立即生效,无需新开终端[^4]。 [^1]: 环境变量设置会传递给所有子进程 [^2]: 通过`find`命令检测Java安装路径 [^3]: 环境变量永久化配置写入`~/.bashrc` [^4]: 使用`source`或`.`可使脚本修改当前Shell环境 [^5]: 非登录Shell自动加载`~/.bashrc`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值