명령의 각 출력에 문자를 어떻게 추가할 수 있나요?

명령의 각 출력에 문자를 어떻게 추가할 수 있나요?

명령을 실행 중이고 아래 예에 표시된 것처럼 각 명령별로 구체적으로 그룹화하고 싶습니다. 인쇄를 시도했지만 echo -e '| $line'파일에 포함된 텍스트를 출력하는 명령에만 영향을 미칩니다.

배경

원래 표시된 터미널 명령이 다음과 같은 비디오를 보았습니다.일부아래 예와 같이 "|"를 사용하여 그룹화합니다. 모든 출력이 각 줄의 시작 부분에 "|" 문자를 갖도록 .bashrc/ 파일 에 대한 .bash_profile함수를 사용자 정의하거나 생성 하려고 합니다.

토론도 찾았습니다.여기. 따라서 아마도 나는 STDERR 및 STDOUT에 대한 함수를 만들 것입니다(언급한 것처럼).여기).

+>system:~/sample
| No command 'sample' found, did you mean:
|  Command 'yample' from package 'yample' (universe)
|  Command 'ample' from package 'ample' (universe)
| sample: command not found
+>system:~/sudo apt-get update 
| [sudo] password for system: 
| Ign http://dl.google.com stable InRelease
| Hit http://dl.google.com stable Release.gpg                                    
| Ign http://security.ubuntu.com trusty-security InRelease                       
| yadda yadda ...
+>system:~/

답변1

sed명령을 통해 파이프 라인을 시도하여 ^줄의 시작 부분( )을 원하는 접두사( )로 바꿀 수 있습니다 |. 예를 들면 다음과 같습니다.

some_command | sed 's/^/| /'

이것은 간단한 명령에는 잘 작동하지만 더 복잡한 응용 프로그램이 커서를 사소하지 않은 방식으로 배치하고 여러 명령의 출력을 지연시키기 때문에 실패합니다(라인 버퍼링에서 더 큰 버퍼 영역을 사용하여 명령이 실행되었는지 확인하기 위해 전환). 표준 출력은 터미널입니다).

나는 일반적으로 이 접근 방식을 포기하고 그 대신에 눈에 띄는 쉘 프롬프트를 구성할 것을 권장합니다(굵게, 기울임꼴, 색상, 배경색, 특수 유니코드 문자 등 무엇이든 사용).

답변2

사람은 이런 일을 할 수 있습니다

LC_ALL=C cm='update-alternatives --display java'; i=0 ; \
while read -r line ; \
do let i++; printf "%s | %3d | %s\n" "$cm" "$i"  "${line}" ; \
done < <($cm)

그러면 다음과 같은 출력이 제공됩니다.

update-alternatives --display java |   1 | java - auto mode
update-alternatives --display java |   2 | link best version is /usr/lib/jvm/java-11-openjdk-amd64/bin/java
update-alternatives --display java |   3 | link currently points to /usr/lib/jvm/java-11-openjdk-amd64/bin/java
update-alternatives --display java |   4 | link java is /usr/bin/java
update-alternatives --display java |   5 | slave java.1.gz is /usr/share/man/man1/java.1.gz
update-alternatives --display java |   6 | /usr/lib/jvm/java-11-openjdk-amd64/bin/java - priority 1111
update-alternatives --display java |   7 | slave java.1.gz: /usr/lib/jvm/java-11-openjdk-amd64/man/man1/java.1.gz

Bash에서 실행되는 모든 명령에 추가하는 솔루션이 없습니다. 다음과 같이 bash 함수로 무언가를 래핑할 수 있습니다.

#!/bin/bash

function ao() {
  export LC_ALL=C
  cm="$*";
  i=0;
  while read -r line ; 
  do
    ((i++));
    printf "%s | %3d | %s\n" "$cm" "$i"  "${line}";
  done < <($cm )
}

이것을 파일에 저장하고 이름을 addoutput.txt로 지정하겠습니다. 그런 다음 이 파일을 가져옵니다.

. addoutput

그런 다음 모든 명령에서 이 기능을 사용할 수 있습니다.

ao yourcommand

@egmont가 언급했듯이 명령에 따라 출력이 원하는 것이 아닐 수도 있습니다. /dev/stderr로 전송된 출력에도 거기에 접두사가 붙은 코드가 없습니다.

관련 정보