디스크에 저장하지 않고 아카이브 스크립트(.tar)를 실행했지만 그 안에 있는 명령이 인식되지 않습니다.

디스크에 저장하지 않고 아카이브 스크립트(.tar)를 실행했지만 그 안에 있는 명령이 인식되지 않습니다.

CentOS에서 .tar 파일로 보관된 스크립트를 실행하고 싶은데, 실행하려고 하면 "읽기" 명령을 인식하지 못합니다.

주요 아이디어는 이 스크립트를 실행하는 것입니다.디스크에 저장되지 않음

  • 목록 내용 또는 .tar 파일 tar -tf script.rar
  • 반환:teste-1.sh
[user@host]$ tar -tf script.rar 
teste-1.sh

파일의 압축을 풀거나, 파일의 압축을 풀고 실행해 보세요.

  • tar -xvf script.rar | xargs bash
  • 상품을 반품하다your full info is:
[user@host]$ tar -xvf script.rar | xargs bash 
your full info is:  
[user@host]$ tar -xvf script.rar | bash -
bash: line 1: teste-1.sh: command not found
[user@host]$ tar -xvf script.rar | sh -
sh: line 1: teste-1.sh: command not found

위에 표시된 대로 출력은 코드의 마지막 줄이며 읽기 프롬프트가 표시되지 않습니다. 테스트 목적으로만 사용되는 완전한 간단한 코드는 다음과 같습니다.

#!/bin/bash
read -p "type your name:" name
read -p "type lastname:" lastname
echo "your full info is: $name $lastname"

수동으로 하려고 하면 잘 작동합니다(아카이브할 필요 없음).

[user@host]$ ./teste-1.sh 
type your name:jhon
type lastname:doe
your full info is: jhon doe
  • | sh -을 사용해 보았지만 | bash -성공하지 못했습니다. 흥미로운 아이디어가 있는 사람이 있나요? 매우 감사합니다!

답변1

존재하다

cmd1 | xargs cmd2

xargs출력을 가져와 cmd1단어(공백으로 구분, 자신만의 방식으로 따옴표 이해)로 분할하고 cmd2해당 단어를 인수로 사용하여 호출합니다.

tar -xvf somearchive, 를 사용하여 tar디스크의 아카이브 구성원을 추출합니다. 따라서 -v일부 출력도 생성되지만 구현에 따라 이 출력은 stdout 또는 stderr에 표시되며 형식은 구현마다 크게 다릅니다. 따라서 xargs bash표준 입력에 아무 것도 표시되지 않거나 어떤 형식으로든 보관된 멤버 목록이 표시되지 않습니다.

따라서 두 메소드 중 하나는 인수 없이 xargs호출됩니다 ( stdin¹에 입력된 빈 스크립트는 해석되어 아무 작업도 수행하지 않음).bashbash

표준 출력의 아카이브 멤버만 출력하는 tar 구현의 경우 (표준 입력은 이제 비어 있음) -v이 호출됩니다 . 압축 해제를 완료하기 전에 아카이브의 표준 출력을 닫지 않는다고 bash teste-1.sh가정하면 시작 시 디스크에 완전히 추출되었으므로 스크립트를 열고 해석할 수 있어야 합니다 .tarteste-1.shbashbash

여기서 파일을 디스크에 추출하지 않으려면 다음을 통과해야 합니다.콘텐츠teste-1.sh아카이브 멤버의 값은 그 안의 코드를 해석하는 bash것이 아니라 표준 입력 에 있습니다.xargsbash

tar -xOf somearchive teste-1.sh | bash

( -O일부 tar구현에서는 tar디스크에 파일을 생성하는 대신 추출된 멤버의 내용을 표준 출력으로 덤프하는 것을 지원합니다.)

bash가 해석할 여러 스크립트를 전달하고 싶지 않기 때문에 추출할 아카이브 멤버의 이름을 전달하고 있습니다. 아카이브 구성원의 이름은 나열된 대로 정확하게 전달되어야 합니다 tar tf.

test-1.sh스크립트가 표준 입력을 읽지 않는다고 가정합니다 . 그렇다면 bash 스크립트 자체의 내용도 읽습니다. 위의 다른 경우에는 입력이 비어 있으므로 스크립트는 아무것도 읽지 않습니다.

이를 방지하는 한 가지 방법은 다음과 같이 호출하는 것입니다.

bash <(tar -xOf somearchive test-1.sh)

이번에는 스크립트의 내용이 명명된 파이프에서처럼 bash에 전달되므로 stdin은 영향을 받지 않습니다.


xargs구현 에 따라 xargs cmdin 에 대한 입력은 와 동일하거나(여기에는 빈 파이프가 있음) cmd(역시 비어 있음)xargs/dev/null

관련 정보