각 프롬프트 전에 실행할 명령을 어떻게 설정합니까?

각 프롬프트 전에 실행할 명령을 어떻게 설정합니까?

나는 이것을 알고 있었지만 각 프롬프트 전에 하나의 명령 또는 여러 명령을 실행하고 싶다는 사실을 잊어버렸습니다. PROD 상자에 있을 때 각 프롬프트 위에 다음과 같은 큰 알림이 있기를 원합니다.* 제작중입니다 *어쩌면 한두 가지 일 수도 있습니다. 현재는 이렇게 메일을 확인하는 것 같은데, 어떻게 설정을 했는지 기억이 나지 않습니다.

ksh 및 Solaris 5.10 사용

어떤 아이디어가 있나요?

감사해요

답변1

원하는 것이 크고 고정된 경고뿐이라면 프롬프트에 다음을 추가하세요.

red=$(tput setaf 1; tput smso; tput bold) reset_color=$(tput sgr0)
PS1='
${red}[THIS IS A PRODUCTION SYSTEM!!]${reset_color}

rest of the prompt$ '

ksh(ksh93, mksh)의 최신(1995년 이후) 구현은 $PS1명령 대체 및 매개변수 확장의 영향을 받으므로 다음을 수행할 수 있습니다.

function mywarning {
  tput setaf 1; tput bold
  date "+it's %T, please remember it's a production system"
  tput sgr0
}

PS1='$(mywarning)# '

ksh88( /usr/bin/kshSolaris 10에서도 동일)에서는 프롬프트에서 매개변수와 물결표 확장만 수행됩니다.

프롬프트에서 멋진 내용을 보려면 스마트 트릭으로 돌아가야 합니다. 그러면 할 수 있는 일이 매우 제한됩니다.

산술 확장은 수행되지 않지만 다음과 같은 확장이 가능하므로 산술 표현식(여기)을 평가할 ${array[expr]}수 있습니다. expr할당(숫자 값에만 해당)이 산술 표현식 내에서 수행될 수 있기 때문에 이는 몇 가지 멋진 작업을 수행할 수 있는 기회를 제공합니다.

$SECONDS, $PWD, $?, $!, $RANDOM, 등의 동적 변수를 후처리하는 데 사용할 수 있습니다 $_.

예를 들어 다음을 사용하여 HH:MM:SS 날짜를 얻을 수 있습니다.

typeset -Z2 _h _m _s
eval "$(date +'SECONDS=$((%H*3600+%M*60+%S))')"
PS1='${z[(_h=SECONDS/3600)+(_m=(SECONDS/60)%60)+(_s=SECONDS%60)]}${_h}:${_m}:${_s} $ '

당신은 당신을 추가할 수 있습니다비만 경고5번마다 프롬프트:

set -A warn '' '
[THIS IS A PRODUCTION SYSTEM!!]
' '' '' ''
PS1='${warn[warn_count=(warn_count+1)%5]}# '

각 프롬프트 전에 명령을 실행할 수는 없을 것 같지만(메일 확인은 내부적으로 수행됨 ksh) DEBUG 트랩을 사용하여 각 명령 후에 명령을 실행할 수 있습니다.

trap 'my-command' DEBUG

모든 서브셸의 모든 간단한 명령 후에 이 작업이 수행된다는 점에 유의하세요.

예를 들어:

for f in *; do :; done

my-command현재 디렉터리에 있는 파일 수만큼 실행됩니다.

존재하다:

: | :

3번이나 실행했는데...실제로는 실용적이지 않습니다.

답변2

/etc/profile그냥 , 또는 에 넣었어요 /etc/issue. 문제파일의 내용을 보여주는 것이 가끔 꺼지기도 하지만, 그래도 참고하기에는 좋은 것 같습니다.

변수의 내용을 변경하는 $PS1것은 괜찮을 것 같습니다. 그리고 여전히 몇 가지 경고를 인쇄하고 싶을 수도 있습니다 /etc/profile. 프로덕션 시스템이므로 시스템에서 지속적인 변경이 발생하기를 원하므로 이러한 파일을 편집할 수 있습니다. (일반적으로 이러한 파일을 변경하지 말고 대신 사용자 파일을 사용하는 것이 좋습니다.)

답변3

다음 명령을 사용하여 호스트, 시간, 위치 및 git 분기를 볼 수 있습니다.

HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

호스트와 같은 항목을 수정할 수 있습니다.

명령을 실행하려면 백틱( these') 을 사용하세요.

관련 정보