출력 파일에 명령을 포함 하시겠습니까?


17

혼란스러운 제목으로 죄송합니다.

내가 뛰었다 고 가정 해

apt-cache depends kde-window-manager > ~/Desktop/kwin-depends

데스크탑 폴더에 "kwin-depends"라는 파일이 있습니다.

파일의 시작 부분에 파일의 일부로 발행 한 명령을 포함시키는 방법이 있습니까?

따라서 적어도 14.04 LTS에서 처음 몇 줄은 다음과 같습니다.

apt-cache depends kde-window-manager > ~/Desktop/kwin-depends

kde-window-manager
  Depends: kde-runtime
  Depends: libc6
 |Depends: libegl1-mesa
  Depends: <libegl1-x11>

이 대신에 :

kde-window-manager
  Depends: kde-runtime
  Depends: libc6
 |Depends: libegl1-mesa
  Depends: <libegl1-x11>

3
다른 많은 훌륭하고 융통성있는 솔루션이 있으므로, 명령을 두 번 입력하여 파일에 수동으로 명령을 작성하고 대신 다목적 솔루션 중 하나를 수락하도록 제안하는 답변을 수락하지 않는 것이 좋습니다.
바이트 사령관

답변:


18

나는 단지 간단한 기능을 사용할 것입니다. 이것을 ~/.bashrc파일에 추가 하십시오 :

function runcom(){
    echo "$@"
    ## Run the command
    $@
}

이제 명령을 실행하고 인쇄 할 때마다 다음을 수행 할 수 있습니다.

runcom apt-cache depends kde-window-manager > out

위의 파일은 다음과 같습니다.

$ cat out
apt-cache depends kde-window-manager
kde-window-manager
  Depends: perl
  Depends: kde-runtime
  Depends: kde-style-oxygen
  Depends: libc6
 |Depends: libegl1-mesa
  Depends: <libegl1-x11>
    libegl1-mesa
  Depends: libgcc1
 |Depends: libgl1-mesa-glx
  Depends: <libgl1>
    libgl1-mesa-swx11
    libgl1-mesa-glx
 |Depends: libgles2-mesa
  Depends: <libgles2>
    libgles2-mesa
  Depends: libice6
  Depends: libkactivities6
  Depends: libkcmutils4
  Depends: libkdeclarative5
  Depends: libkdecorations4abi2
  Depends: libkdecore5
  Depends: libkdeui5
  Depends: libkio5
  Depends: libknewstuff3-4
  Depends: libkwineffects1abi5
  Depends: libkwinglesutils1
  Depends: libkwinglutils1abi2
  Depends: libkworkspace4abi2
  Depends: libplasma3
  Depends: libqt4-dbus
  Depends: libqt4-declarative
  Depends: libqt4-script
  Depends: libqtcore4
  Depends: libqtgui4
  Depends: libsm6
  Depends: libstdc++6
  Depends: libwayland-client0
 |Depends: libwayland-egl1-mesa
  Depends: <libwayland-egl1>
    libwayland-egl1-mesa
  Depends: libx11-6
  Depends: libx11-xcb1
  Depends: libxcb-composite0
  Depends: libxcb-damage0
  Depends: libxcb-image0
  Depends: libxcb-keysyms1
  Depends: libxcb-randr0
  Depends: libxcb-render0
  Depends: libxcb-shape0
  Depends: libxcb-shm0
  Depends: libxcb-sync1
  Depends: libxcb-xfixes0
  Depends: libxcb-xtest0
  Depends: libxcb1
  Depends: libxcursor1
  Depends: libxext6
  Depends: libxrandr2
  Depends: libxxf86vm1
  Breaks: kde-style-bespin
  Breaks: kde-style-bespin:i386
  Breaks: <kde-style-skulpture>
  Breaks: <kde-style-skulpture:i386>
  Breaks: kde-workspace-data
  Breaks: <kde-workspace-data:i386>
  Breaks: kdeartwork-theme-window
  Breaks: kdeartwork-theme-window:i386
  Breaks: <kdebase-workspace-data>
  Breaks: <kdebase-workspace-data:i386>
  Breaks: kwin-style-crystal
  Breaks: kwin-style-crystal:i386
  Breaks: kwin-style-dekorator
  Breaks: kwin-style-dekorator:i386
  Breaks: kwin-style-qtcurve
  Breaks: kwin-style-qtcurve:i386
  Replaces: kde-workspace-data
  Replaces: <kde-workspace-data:i386>
  Replaces: <kdebase-workspace-data>
  Replaces: <kdebase-workspace-data:i386>
  Conflicts: kde-window-manager:i386

여기에 목표 포스트를 옮기는 것이 아니라 코드에서 별칭을 수락하도록하는 방법이 있습니까? 예를 들어,에 별명 apt-cache depends을 지정 acd하면 "실행할 때"acd '명령을 찾을 수 없습니다. ... "라는 메시지가 나타납니다 runcom acd leafpad > out.
DK Bose

@DKBose 별명은 쉘이 아닌 .bashrc 파일에 정의되며 함수는 $ PATH variable 아래에있는 2 진 파일 만 호출합니다. 그러나 간단한 트릭을 할 수 있습니다. 예를 들어, 실제로 ls는 별명 ls --color=auto'입니다. 별명에 작은 따옴표 나 큰 따옴표가없는 한 할 수있는 일은 다음과 같습니다 $ terdonsFunction $(alias ls | awk -F '=' '{$1="";print}'| tr "'" " ") .
Sergiy Kolodyazhnyy

또는 명령을 변수로 바꾸십시오. 내가 전에 대답했듯이. MYCOMMAND="apt-cache depends"; terdonsFunction $MYCOMMAND leafpad > out.txt
Sergiy Kolodyazhnyy

@ Serg, GARCIN David의 답변을 참조하십시오 : askubuntu.com/a/688936/248158
DK Bose

이것은 "명백한"대답이며 인수 중 하나라도 실행되고 누적 될 수있는 부작용이있는 코드가없는 한 훌륭하게 작동합니다. 이것은 엣지 케이스이므로 자주 발생하지 않습니다.
Joe

11

넌 할 수있어:

tee file.txt <<<'apt-cache depends kde-window-manager' | bash >>file.txt

echoHere strings ( <<<) 대신 사용 하는 것과 같습니다 .

echo 'apt-cache depends kde-window-manager' | tee file.txt | bash >>file.txt
  • tee STDOUT 및 파일에 기록합니다. file.txt

  • tee즉 , STDOUT은 명령을 실행하고 STDOUT을에 추가 apt-cache depends kde-window-manager하도록 공급 bash됩니다 file.txt.

예:

$ echo 'apt-cache depends kde-window-manager' | tee file.txt | bash >>file.txt

$ cat file.txt 
apt-cache depends kde-window-manager
kde-window-manager
  Depends: kde-runtime
  Depends: libc6
 |Depends: libegl1-mesa
  Depends: <libegl1-x11>

1
좋은 답변입니다! 간단하고 포인트! 나는 하나를 시도 tee했지만 내 실패는 계속했다. 잘 했어! +1
Terrance

@Seth 나는 또한 파일 디스크립터를 가지고 노는 것에 대해 생각했지만 tee깔끔하게 보인다 :)
heemayl

11

가장 미니멀리즘-접근법 # 4와 # 3은 둘 다 기능으로 변환 될 수 있습니다. # 2 내가 좋아하는 것- awk. # 1 script명령을 사용합니다 -일반적으로 명령 행을 기록하는 데 유용한 매우 다양한 도구입니다. 기록하고자하는 모든 곳에서 적용 가능합니다.

# 1에 접근 :/usr/bin/script프롬프트 및 명령과 함께 명령 줄 출력을 캡처의 모든 것을 기록 (기본적으로 우분투와 함께 제공) 명령. 하나의 명령과 해당 출력을 특정 파일에 저장하려면 -c플래그를 사용하고 출력 파일을 지정하십시오. 예

xieerqi:$ script -c 'apt-cache depends gnome-terminal' outputFile.txt
Script started, file is outputFile.txt
gnome-terminal
  Depends: gconf-service
    gconf-service:i386
  Depends: libatk1.0-0
  Depends: libc6
  Depends: libgconf-2-4
  Depends: libgdk-pixbuf2.0-0
     (extra output omitted)
Script done, file is outputFile.txt

xieerqi:$ cat outputFile.txt                                              
Script started on 20151022 星期四 085846
gnome-terminal
  Depends: gconf-service
    gconf-service:i386
  Depends: libatk1.0-0
  Depends: libc6
  Depends: libgconf-2-4
  (extra output omitted)

Script done on 20151022 星期四 085846

접근법 # 2 : awk hackery

Awk에는 스크립트 또는 명령 에서system() 쉘 명령을 실행할 수있는 기능이 있습니다 . 출력은 화면에 명령이 먼저 표시되고 다음에 출력이 표시됩니다. 보이는 것을 파일로 리디렉션하려면 연산자를 사용하십시오 .awk>

그것은 두 가지 방법으로 수행 될 수 있습니다-사용자에게 stdin 또는 명령 줄 인수로 물건을 입력하도록 요청하십시오. 첫 번째는 달성하기가 쉽기 때문에 게시하는 것입니다.

(1) awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'

 awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
Enter command to run: 
apt-cache depends gnome-terminal
gnome-terminal
  Depends: gconf-service
    gconf-service:i386
  Depends: libatk1.0-0
  Depends: libc6
  Depends: libgconf-2-4
  Depends: libgdk-pixbuf2.0-0
  Depends: libglib2.0-0 
  (extra output omitted)

(2) 명령 행 인수 버전; 너무 긴 답변을 피하기 위해 출력을 포함하지 않습니다. 다시 >파일로 리디렉션에 추가

awk 'BEGIN{for (i=1; i<= ARGC; i++) myString = myString"  "ARGV[i]; print myString; system(myString)  }' apt-cache depends gnome-terminal

접근법 # 3 : bash에게 작업을 요청하십시오.

xieerqi@eagle:~$ bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND    '
apt-cache depends gnome-terminal
gnome-terminal
  Depends: gconf-service
    gconf-service:i386
  Depends: libatk1.0-0
  Depends: libc6
  Depends: libgconf-2-4
  Depends: libgdk-pixbuf2.0-0
  Depends: libglib2.0-0

>연산자 를 사용하여 파일로 리디렉션 :

bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND ' > output.txt

접근법 # 4 :( 나의 두번째 좋아하는)

ByteCommander의 게시물에서 영감을 얻었습니다. read서브 쉘에서 필요한 명령을 사용 하고 실행할 수 있습니다

read command && (printf "COMMAND: %s" "$command";printf "\n+++++++\n"; sh -c "$command")

샘플 실행 :

xieerqi:$ read command && (printf "COMMAND READ: %s" "$command";printf "\n+++++++\nOUTPUT\n"; sh -c "$command")                                       
printf "This was a triumph; I'm making a note here - huge success"
COMMAND READ: printf "This was a triumph; I'm making a note here - huge success"
+++++++
OUTPUT
This was a triumph; I'm making a note here - huge success

접근법 # 5 :

echo또는 here string(일명 <<< "string")을 사용 sh -c하여xargs

xieerqi:$ echo "apt-cache policy gnome-terminal" | xargs -I {} bash -c 'echo {}; {}'                                                            
apt-cache policy gnome-terminal
gnome-terminal:
  Installed: 3.6.2-0ubuntu1
  Candidate: 3.6.2-0ubuntu1
  Version table:
 *** 3.6.2-0ubuntu1 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
        100 /var/lib/dpkg/status

그리고 원하는 경우 별칭과 동일한 트릭을 사용할 수 있습니다.

xieerqi:$ printAndRun <<< "apt-cache policy gnome-terminal"                                                                                     
apt-cache policy gnome-terminal
gnome-terminal:
  Installed: 3.6.2-0ubuntu1
  Candidate: 3.6.2-0ubuntu1
  Version table:
 *** 3.6.2-0ubuntu1 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
        100 /var/lib/dpkg/status

xieerqi:$ type printAndRun
printAndRun is an alias for 'xargs -I {} bash -c "echo {}; {}"'

훌륭하지만 Arronical의 코드와 같은 명령은 포함되어 있지 않습니다.
DK Bose

@DKBose 명령을 포함 할 다른 접근 방식을 추가하겠습니다. 5 분
Sergiy Kolodyazhnyy

@DKBose 내 접근 방식 # 2는 어떻습니까?
Sergiy Kolodyazhnyy

그것은 영리합니다. awk실제로 매우 구성 가능한 작은 친구입니다! `스크립트는 다른 용도로도 유용하게 보입니다.
Arronical

1
스크립트를 사용하면 echo 등으로 표시 될 때 코드를 실행할 수있는 인수로 인한 부작용을 피할 수 있기 때문에 가장 좋은 대답입니다. 두 번째, 의도 된 실행은 명령이 개별적으로 실행 된 경우와 다른 결과를 제공 할 수 있습니다.
Joe

6
  1. 스타트 script -q outputfile
  2. 당신의 명령을 실행
  3. Ctrl-를 누르십시오D
  4. 파일을여십시오 outputfile

스타트 script

[aboettger:~/tmp] % script -q ~/Desktop/kwin-depends

당신의 명령을 시작

[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>
[aboettger:~/tmp] % 

Ctrl-를 누르십시오D

Script done, file is /home/aboettger/Desktop/kwin-depends

명령 및 출력 표시

[aboettger:~/tmp] % cat ~/Desktop/kwin-depends

그리고 당신은 이와 같은 것을 보게 될 것입니다

[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>

5

별칭 확장을 원한다면 (bash 만) 다음과 같이 할 수 있습니다.

function runcmd
{
    local check_cmd=${BASH_ALIASES[$1]}

    if [ -z "$check_cmd" ]; then
        check_cmd=$1
    fi

    shift #skip 1st arg

    echo "$check_cmd $@"
    $check_cmd $@
}

당신은 지금 실행할 수 있습니다

runcmd acd leafpad > out

4

더 쉬운 방법이있을 수 있지만 스크립트로 수행 할 수 있습니다.

#!/bin/sh
echo $1
apt-cache depends $1

script홈 폴더에이 컨텐츠가 포함 된 파일 을 작성하고 실행 권한을 부여하십시오.

chmod +x script

이 방법으로 실행하십시오.

./script kde-window-manager > ~/Desktop/kwin-depends

이 방법은 나중에 원하는 경우 해당 명령 줄을 쉽게 반복 할 수 있다는 장점이 있습니다! 스크립트에 리디렉션을 쓸 수도 있으므로 script.sh항상 script.log출력으로 호출되는 파일을 만듭니다 .
Gaurav

4

단선 Bash 기능을 사용하는 매우 간단한 솔루션

예비:

이 접근법은 사용자 정의 bash 기능을 사용하여 원하는 기능을 제공합니다. 터미널 세션에서 다음 줄을 실행하여 정의합니다. 다음 대신 유효한 bash 변수 이름을 선택할 수 있습니다 runandlog.

runandlog () ( IFS=' '; printf "[%s] $ %s\n%s\n" "$USER" "${*:2}" "$("${@:2}")" | tee -a "$1" | tail -n +2; )

그러나 이것은 현재 Bash 세션에 대해서만 지속됩니다. 즉, 터미널 창을 닫은 후에는 기능이 사라집니다.
그래도 시도하고 좋아한다면 ~/.bashrc파일 을 편집 하고이 줄을 파일 끝에 추가 하여 항상 사용할 수 있습니다 .

사용하는 방법:

함수를 정의한 후에는 명령 자체와 해당 출력을 모두 파일에 기록하면서 명령을 실행하는 데 사용할 수 있습니다. 이미 함수에 포함시킨 정보 또는 실행 한 시간과 같은 정보를 추가 할 수도 있습니다. 의견의 기능 요청은 환영합니다! :)

구문은 간단합니다.

runandlog LOGFILENAME YOUR-COMMAND-WITH-ARGUMENTS

예:

bytecommander홈 디렉토리에서 작동 하는 user라는 예제 세션 은 다음과 같습니다.

bytecommander: ~ $  runandlog mylogfile fortune
A mathematician is a device for turning coffee into theorems.
        -- P. Erdos

내용이있는 현재 디렉토리에 새 파일 mylogfile 이 이미있을 경우 (이미 존재하면 함수가 출력을 파일에 추가합니다!)

[bytecommander] $ fortune 
A mathematician is a device for turning coffee into theorems.
        -- P. Erdos

3

상당히 비열하지만 기능적인 트릭은 다음과 같습니다.

(echo "apt-cache depends kde-window-manager" && apt-cache depends kde-window-manager) > ~/Desktop/kwin-depends

추악하지만 작동합니다!


솔루션이 더 광범위하게 적용되기 때문에이 답변을 수락합니다.
DK Bose

@DKBose 모듈을 두 번 입력해야합니다. 그러나 스크립트를 사용한 솔루션은 실제로 보편적입니다.
Pilot6

요청한 내용을 수행하더라도이 답변을 수락하지 않아야합니다. 나는 당신이 상관하지 않기를 바랍니다!
DK Bose

2
@DKBose 문제가 아니라, 나는 대답을 제출했을 때 상당히 우아하지 않은 해결책이라는 것을 알았고 게시 된 대안 답변에서 좋은 것을 배웠습니다.
Arronical

2

명령을 먼저 인쇄하고 나중에 명령의 출력을 출력하는 함수에 명령을 전달할 수 있습니다 (재 지정은 인쇄 된 명령에서 의도적으로 유지됩니다. 명령에서 따옴표를 제거하고 $@대신 인쇄하고 대신 실행하여 쉽게 변경할 수 있습니다) 의 $1) 함수에서 :

function myfunction() {
    printf "%s\n\n" "$1"
    $1
}
$ myfunction "printf \"bar\n\"" > foo
$ cat foo
printf "bar\n"

bar

나중에 명령을 추가하려면이 명령을 실행하면 파일 맨 위에 마지막 명령 실행이 삽입됩니다.

<<<"$(<foo)" cat <(history 2 | sed -n '1s/  [0-9][0-9]*  \(.*\)/\1\n/p') - >foo
  • <<<"[...]": 여기 문자열; [...]로 리디렉션 catstdin;
  • $(<foo): 명령 대체; "foo"의 내용으로 대체됩니다.
  • cat [...] - >foo: "foo"에 연결 stdin하여 [...]출력합니다.
  • <([...]): 프로세스 대체 : [...]; 의 출력을 포함하는 파일 디스크립터로 대체됩니다 .
  • history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p': 마지막 두 명령을 출력하고 첫 번째 행에서 두 개의 공백과 하나 이상의 숫자, 두 개의 공백을 제거한 후 인쇄합니다.
$ printf "bar\n" >foo
$ <<<"$(<foo)" cat <(history 2 | sed -n '1s/  [0-9][0-9]*  \(.*\)/\1\n/p') - >foo
$ cat foo
printf "bar" >foo

bar

왜 인쇄 만 $1합니까? 그리고 필요가 없습니다 eval.
terdon

@ terdon 글쎄, 아이디어는 OP의 경우 더 멋지게 보일 것이라고 생각했기 때문에 인쇄 된 명령에서 리디렉션을 유지하는 것이 었습니다. 그럼에도 불구하고 지금 변경하면 귀하의 답변과 동일합니다. 그러나 예, eval필요하지 않습니다. 왜 전에 추가했는지 확실하지 않습니다. 감사.
kos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.