Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)
(시리즈 글이 3개 있습니다.)
개발 환경 구성: 298. Windows 10 - bash 실행 시 시작 디렉터리 자동 변경
; https://www.sysnet.pe.kr/2/0/11046

Linux: 25. 자주 실행할 명령어 또는 초기 환경을 "~/.bashrc" 파일에 등록
; https://www.sysnet.pe.kr/2/0/12077

Linux: 59. dockerfile - docker exec로 container에 접속 시 자동으로 실행되는 코드 적용
; https://www.sysnet.pe.kr/2/0/13337




linux - 자주 실행할 명령어 또는 초기 환경을 "~/.bashrc" 파일에 등록

전에도 한 번 다룬 적이 있는데요,

Windows 10 - bash 실행 시 시작 디렉터리 자동 변경
; https://www.sysnet.pe.kr/2/0/11046

이번엔 .bashrc에 대해 한 단계 더 나아가 보겠습니다. ^^




제 경우에 "ls -l" 명령어를 자주 사용하는데 "-l"을 붙이려니 꽤나 귀찮군요. ^^; 게다가 "dotnet-dump" 같은 도구는 설치하고 나서,


$ dotnet tool install -g dotnet-dump
You can invoke the tool using the following command: dotnet-dump
Tool 'dotnet-dump' (version '3.1.57502') was successfully installed.

설치를 했던 바로 그 사용자 환경에서는 실행이 잘 되지만, "sudo -s"를 통한 root 권한으로 넘어가면 명령어를 못 찾기 때문에,

$ dotnet-dump
Required command was not provided.

Usage:
  dotnet-dump [options] [command]

Options:
  --version    Display version information

Commands:
  collect                Capture dumps from a process
  analyze <dump_path>    Starts an interactive shell with debugging commands to explore a dump
  ps                     Display a list of dotnet processes to create dump from

$ sudo -s
[sudo] password for tusr:

root:~# dotnet-dump
dotnet-dump: command not found

root 권한에서는 그때마다 이렇게 긴 명령어를 치는 것이 또 귀찮아집니다.

root:~# /home/tusr/.dotnet/tools/dotnet-dump

이를 위해 아래와 같은 명령어를 .bashrc 파일에 등록하면 되는데,

alias l1='ls -l'
export PATH=$PATH:$HOME/.dotnet/tools

리눅스 배포판에 따라 .bashrc의 관리가 다르다는 점을 감안해야 합니다. 가령 centos 7의 경우 $ user와 # root의 ~/.bashrc 경로가 다르고 따라서 당연히 파일도 다릅니다.
$ ls ~/.bashrc -l
-rw-r--r--. 1 tusr tusr 287 Dec 13 10:33 /home/tusr/.bashrc

$ cat ~/.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

$ sudo -s

root:~# ls ~/.bashrc -l
-rw-r--r--. 1 root root 232 Dec 13 10:32 /root/.bashrc

root:~# cat ~/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

즉, Centos 7 사용자라면 2개의 파일 모두에 Shell 명령어를 등록해 주어야 합니다. 또는, 스크립트에 나오듯이 "/etc/bashrc"를 모두 실행하고 있으므로 공통 명령어는 그곳에 등록해 두면 모든 사용자 계정에서 쓸 수 있습니다.

반면 Ubuntu 18.04는 사용자의 .bashrc와 "sudo -s"로 전환했을 때의 .bashrc 경로가 동일하게 유지됩니다.

$ ls ~/.bashrc -l
-rw-r--r-- 1 tusr tusr 3935 12월 13 10:36 /home/tusr/.bashrc

$ sudo -s

# ls ~/.bashrc -l
-rw-r--r-- 1 tusr tusr 3935 12월 13 10:36 /home/tusr/.bashrc

따라서 하나의 파일만 변경해 주면 "sudo -s" 전환 환경에서도 불편 없이 사용할 수 있습니다. 게다가 Centos 7의 .bashrc 내에서 /etc/bashrc를 실행했던 반면, Ubuntu 18.04의 .bashrc에서는 ~/.bash_aliases, /etc/bash_completion 등의 스크립트를 실행하는 코드를 포함합니다.

$ cat ~/.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
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

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

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# 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

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

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

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# 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 ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

export NVM_DIR="/home/tusr/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm




참고로 아래의 글에 보면,

How to automatically run commands on SSH login?
; https://superuser.com/questions/355029/how-to-automatically-run-commands-on-ssh-login

덧글에 재미있는 의견이 하나 있습니다. ^^

If you need commands to only run when logging in via ssh (but not when logging in physically), you could probably test for the presence of the SSH_CONNECTION environment variable, and only run the commands if you find it exists.


그런데 "sudo -s" 권한 변경 시에는 이 값이 유지되지는 않습니다.

$ echo $SSH_CONNECTION
192.168.100.50 14242 192.168.100.60 22

$ sudo -s
[sudo] tusr의 암호: 

root:~# echo $SSH_CONNECTION

root:~#

너무도 다양한 리눅스 환경이군요. ^^




페도라의 경우 쉘 초기화 규칙은 다음과 같은 식이라고.

[리눅스 부팅 시 모든 사용자에게 적용]
1차: /etc/profile
2차: /etc/bashrc (우분투: /etc/bash.bashrc)

[개별 사용자에게 적용]
1차: ~/.bash_profile (우분투: ~/.profile)
2차: ~/.bashrc




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 10/8/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
1755정성태9/22/201434239오류 유형: 241. Unity Web Player를 설치해도 여전히 설치하라는 화면이 나오는 경우 [4]
1754정성태9/22/201424571VC++: 80. 내 컴퓨터에서 C++ AMP 코드가 실행이 될까요? [1]
1753정성태9/22/201420596오류 유형: 240. Lync로 세미나 참여 시 소리만 들리지 않는 경우 [1]
1752정성태9/21/201441057Windows: 100. 윈도우 8 - RDP 연결을 이용해 VNC처럼 사용자 로그온 화면을 공유하는 방법 [5]
1751정성태9/20/201438916.NET Framework: 464. 프로세스 간 통신 시 소켓 필요 없이 간단하게 Pipe를 열어 통신하는 방법 [1]파일 다운로드1
1750정성태9/20/201423827.NET Framework: 463. PInvoke 호출을 이용한 비동기 파일 작업파일 다운로드1
1749정성태9/20/201423728.NET Framework: 462. 커널 객체를 위한 null DACL 생성 방법파일 다운로드1
1748정성태9/19/201425378개발 환경 구성: 238. [Synergy] 여러 컴퓨터에서 키보드, 마우스 공유
1747정성태9/19/201428386오류 유형: 239. psexec 실행 오류 - The system cannot find the file specified.
1746정성태9/18/201426071.NET Framework: 461. .NET EXE 파일을 닷넷 프레임워크 버전에 상관없이 실행할 수 있을까요? - 두 번째 이야기 [6]파일 다운로드1
1745정성태9/17/201423028개발 환경 구성: 237. 리눅스 Integration Services 버전 업그레이드 하는 방법 [1]
1744정성태9/17/201431033.NET Framework: 460. GetTickCount / GetTickCount64와 0x7FFE0000 주솟값 [4]파일 다운로드1
1743정성태9/16/201420980오류 유형: 238. 설치 오류 - Failed to get size of pseudo bundle
1742정성태8/27/201426946개발 환경 구성: 236. Hyper-V에 설치한 리눅스 VM의 VHD 크기 늘리는 방법 [2]
1741정성태8/26/201421328.NET Framework: 459. GetModuleHandleEx로 알아보는 .NET 메서드의 DLL 모듈 관계파일 다운로드1
1740정성태8/25/201432494.NET Framework: 458. 닷넷 GC가 순환 참조를 해제할 수 있을까요? [2]파일 다운로드1
1739정성태8/24/201426489.NET Framework: 457. 교착상태(Dead-lock) 해결 방법 - Lock Leveling [2]파일 다운로드1
1738정성태8/23/201422040.NET Framework: 456. C# - CAS를 이용한 Lock 래퍼 클래스파일 다운로드1
1737정성태8/20/201419736VS.NET IDE: 93. Visual Studio 2013 동기화 문제
1736정성태8/19/201425564VC++: 79. [부연] CAS Lock 알고리즘은 과연 빠른가? [2]파일 다운로드1
1735정성태8/19/201418148.NET Framework: 455. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 두 번째 이야기
1734정성태8/13/201419801오류 유형: 237. Windows Media Player cannot access the file. The file might be in use, you might not have access to the computer where the file is stored, or your proxy settings might not be correct.
1733정성태8/13/201426326.NET Framework: 454. EmptyWorkingSet Win32 API를 사용하는 C# 예제파일 다운로드1
1732정성태8/13/201434454Windows: 99. INetCache 폴더가 다르게 보이는 이유
1731정성태8/11/201427050개발 환경 구성: 235. 점(.)으로 시작하는 파일명을 탐색기에서 만드는 방법
1730정성태8/11/201422139개발 환경 구성: 234. Royal TS의 터미널(Terminal) 연결에서 한글이 깨지는 현상 해결 방법
... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...