问题
当某个软件如java安装在某个用户下,软件的环境变量放在 ~/.bash_profile 或 ~/.zshrc .SSH 远程执行脚本报错"command not found" .环境变量不生效。
login shell 和 non-login shell
Login shell : 登陆linux 系统的时候,要求输入 用户名和密码或者 SSH key 登陆时。
Non-login shell: 用 Ansible 在目标机器上远程执行Shell 脚本的时候,就是non-login shell
linux bash 环境配置文件
终端运行 man bash
FILES
/bin/bash
The bash executable
/etc/profile
The systemwide initialization file, executed for login shells
/etc/bash.bashrc
The systemwide per-interactive-shell startup file
/etc/bash.bash.logout
The systemwide login shell cleanup file, executed when a login shell exits
~/.bash_profile
The personal initialization file, executed for login shells
~/.bashrc
The individual per-interactive-shell startup file
~/.bash_logout
The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
Individual readline initialization file
参考 鸟哥私房菜:
login shell加载环境变量的顺序是:① /etc/profile ② ~/.bash_profile ③ ~/.bashrc ④ /etc/bashrc
而non-login shell加载环境变量的顺序是: ① ~/.bashrc ② /etc/bashrc
non-login shell 的环境配置问题的解决
方法1: 把配置放在 non-login shell 加载下的文件
方法1:如果把配置放在 ~/.bash_profile 中,需要non-login shell 时先 source ~/.bash_profile 再执行命令
虽然大多数情况下,在Shell开头用#!/usr/bin/env bash比#!/bin/bash更有通用性,但是在通过SSH远程执行Shell脚本时,Shell开头要用#!/bin/bash
Ansible的become进行用户切换
参考