“sh”또는“bash”명령을 사용하지 않고 쉘 스크립트를 어떻게 실행합니까?


261

"sh"또는 "bash"명령을 사용하지 않고 실행하려는 쉘 스크립트가 있습니다. 예를 들면 다음과 같습니다.

대신에: sh script.sh

사용하고 싶습니다 : script.sh

어떻게해야합니까?

추신 (i) 나는 셸 스크립트를 많이 사용하지 않고 별칭에 대해 읽으려고 시도했지만 별칭을 사용하는 방법을 이해하지 못했습니다.

(ii) 스크립트를 PATH 변수의 다른 파일과 연결하는 방법에 대해서도 읽었습니다. 대학 서버를 사용하고 있는데 해당 위치에서 파일을 만들 수있는 권한이 없습니다.


1
답은 스크립트를 실행 가능하게 만드는 방법을 나타내지 만, 액세스 가능하게 만드는 방법을 다루지는 않습니다. 이를 위해 bin 디렉토리를 직접 만드십시오.-디렉토리가 $HOME/bin없다면 PATH에 추가하십시오 (앞쪽). 여기에 경로 이름을 지정하지 않고 직접 실행하려는 스크립트 (및 다른 프로그램)를 넣거나 실제 프로그램이있는 위치에 심볼릭 링크를 넣으십시오.
Jonathan Leffler

1
아래의 답변을 따른 후 ".sh"를 삭제하면 파일 이름을 바꿀 수 있습니다. mv example.sh example그런 다음 example자체적으로 작동해야합니다.
PJ Brunet

답변:


434

파일 맨 위에 "shebang"을 추가하십시오.

#!/bin/bash

그리고 파일을 실행 가능하게 만드십시오 ( chmod +x script.sh).

마지막으로 경로를 수정하여 스크립트가있는 디렉토리를 추가하십시오.

export PATH=$PATH:/appropriate/directory

(일반적으로 $HOME/bin자체 스크립트를 저장 하려고 합니다)


답장 주셔서 감사합니다. 나는 그것을 시도했다. 이제 "sh"명령없이 실행할 수 있습니다. 그러나 여전히 원하지 않는 "./"로 명령 앞에 접두사를 붙여야합니다. :)
Rameez Hussain

5
경로에 대한 의견을 참조하십시오. PATH에 추가해야하는 디렉토리에 스크립트를 넣어야합니다.
fge

2
내 경우에는 작동하지 않았습니다. 하지만 source script.sh벌금을했다, 또는 오히려 source <filename_without_any_extension_type>
MycrofD

4
source ./my-cool-script(또는 . ./my-cool-script)는 현재 쉘 세션을 스크립트에 정의 된 변수로 오염시킵니다. 환경 변수를 설정하고 디렉토리를 변경하는 등의 방법으로 쉘 세션을 명시 적으로 수정하지 않는 한 소싱을 사용하지 않아야합니다. 소싱을 통해 수행되는 경우 한 스크립트 실행의 변수가 다른 스크립트 실행에 영향을 줄 수 있으므로 실제로 매우 심각한 버그가 발생할 수 있습니다.
Daniel Waltrip

3
스크립트 폴더가 PATH에 있고 여전히없이 작동하지 않으면 ./이름 충돌이있을 수 있습니다. 이름을 바꾸십시오.
chorbs

66

다음은 스크립트 이름을 직접 사용하기위한 전제 조건 중 일부입니다.

  1. she-bang (#!/bin/bash)맨 위에 줄을 추가하십시오 .
  2. 사용 chmod u+x scriptname하여 스크립트를 실행 가능하게합니다. (여기서 scriptname스크립트 이름이 있습니다)
  3. 스크립트를 /usr/local/bin폴더 아래에 배치하십시오 .
  4. 스크립트 이름 만 사용하여 스크립트를 실행하십시오.

참고 :/usr/local/bin 폴더 아래에 배치하도록 제안한 이유 는 경로가 이미에 추가되었을 가능성이 높기 때문 PATH variable입니다.

최신 정보:

/usr/local/bin폴더에 액세스 할 수 없으면 다음을 수행하십시오.

  1. 홈 디렉토리에 폴더를 작성하고 호출하십시오 myscripts.
  2. 수행 ls -lart쉘이 사용하는 시작 스크립트를 식별, 홈 디렉토리에. .profile또는 이어야합니다 .bashrc.
  3. 시작 스크립트를 식별했으면 스크립트에 다음 줄을 추가하십시오- export set PATH=$PATH:~/myscript.
  4. 추가 한 후에는 시작 스크립트를 소싱하거나 로그 아웃했다가 다시 로그인하십시오.
  5. 를 사용하여 스크립트를 실행하십시오 scriptname.

이 작업을 시도했지만 / usr / local / bin 폴더에 액세스 할 수있는 권한이 없습니다. 대학 컴퓨터를 사용하고 있습니다.
Rameez Hussain

1
"스타트 업 스크립트 소스"의 의미를 알려주시겠습니까?
Rameez Hussain

1
시작 스크립트를 소싱한다는 것은 새로 실행 된 매개 변수를 PATH 변수로 선택하여 셸에서이를 선택하는 것을 의미합니다. 이 작업을 수행하여 수행 할 수 있습니다 . .bashrc. 즉, .그 뒤에 space시작 스크립트 이름을 입력하십시오.
jaypal 싱

나는 시스템의 문제가 무엇인지 모른다. "echo"hello ""만 포함 된 "hello"라는 새 쉘 스크립트를 작성했습니다. 권한을 변경하고 ./hello를 시도했습니다. 작동하지 않습니다. 그것은 says-
램 에즈 후세인에게

시작 스크립트를 어떻게 변경 했습니까?
jaypal singh

20

를 사용하여 실행 파일인지 확인하십시오 chmod +x. 기본적으로 현재 디렉토리는 PATH에 없으므로 디렉토리를 실행 ./script.sh하거나 규정 된 경로로 참조해야합니다. 또는 진정으로 필요한 경우 script.shPATH에 추가해야합니다. 시스템 경로를 수정할 수는 없지만 현재 환경의 PATH를 거의 확실하게 수정할 수 있습니다. 또한 스크립트가 다음과 같은 것으로 시작한다고 가정합니다.#!/bin/sh .

셸 스크립트와 실제로 관련이 없으며 셸과 관련이있는 별칭을 계속 사용할 수도 있습니다.

alias script.sh='sh script.sh'

을 대신하여 단순히 script.sh(문자 그대로-다른 *.sh파일 에서는 작동하지 않음) 사용할 수 있습니다 sh script.sh.


야! 답장을 보내 주셔서 감사합니다. 이전에 별칭을 사용해 보았습니다. 그러나 아무 일도 일어나지 않았습니다. "#! / usr / local / bin / bash"줄 바로 뒤에 배치했습니다. 무엇이 잘못되었다고 생각하십니까?
Rameez Hussain

1
별칭은 스크립트 내에서 정의 할 수 없습니다. 현재 환경의 일부로 선언해야합니다. 따라서 alias쉘 프롬프트에서 명령을 실행하면 별명을 사용하여 명령을 실행할 수 있습니다.
ziesemer

17

이 예제에서 파일은 myShell

우선이 파일을 만들어야합니다. 다음을 입력하여 시작할 수 있습니다.

sudo nano myShell

.sh확장 프로그램을 넣지 않았 습니까? 터미널에서 실행할 때 입력 만하면되기 때문입니다.myShell 명령을 실행하기 위해 하기 만하면되기 때문입니다!

이제 nano에서 맨 위 줄이어야 #!/bin/bash합니다. 계속하기 전에 새 줄을 남길 수 있습니다.

데모를 위해 기본 Hello World!응답 을 추가합니다

따라서 다음을 입력합니다.

echo Hello World!

그 후 내 예제는 다음과 같아야합니다.

#!/bin/bash
echo Hello World!

이제 파일을 저장 한 후 다음 명령을 실행하십시오.

sudo chmod +x myShell

이제 /usr/bin/다음 명령을 사용하여 파일을 이동할 수있는 파일을 만들었습니다 .

sudo cp myShell /usr/bin/

머신이 제대로 실행되도록하려면 머신을 재부팅해야합니다.

나는 사용했다 sudo shutdown -r now

축하합니다! 우리의 명령이 완료되었습니다! 터미널에서 우리는 입력 할 수 myShell있으며 말을해야Hello World!


1
/usr/bin많은 파일을 자신의 파일에 넣지 말아야합니다. 많은 시스템 /usr/local/bin이이 목적으로 사용되며 /usr/binOS 전용으로 예약되어 있습니다.
tripleee

sudo chmod자신의 파일이 필요하지 않습니다 .
tripleee

머신을 재부팅 할 필요가 없습니다. 최대 당신은 다시 소스해야합니다
Luca Di Liello

14

프로그램의 실행 비트를 활성화해야합니다.

chmod +x script.sh

그런 다음 사용할 수 있습니다 ./script.sh

.bashrc파일을 홈 디렉토리에있는 파일 의 PATH에 폴더를 추가 할 수 있습니다 . 파일 끝에 다음 줄을 추가하십시오.

export PATH=$PATH:/your/folder/here

이미 올바른 권한을 설정했음을 언급하지 않았습니다. 나는 명령이 "755 script.sh chmod를"사용
램 에즈 후세인

6

sudo install (스크립트 이름) / usr / local / bin / (스크립트를 실행하기 위해 입력하려는 내용)을 입력 할 수 있습니다

예 : sudo install quickcommit.sh /usr/local/bin/quickcommit 비밀번호를 입력하십시오

이제 .sh없이 모든 디렉토리에서 실행할 수 있습니다.


3

추가하십시오. (현재 디렉토리)를 PATH 변수에 추가하십시오.
.profile 파일을 편집하여이를 수행 할 수 있습니다.
.profile 파일에 다음 줄을 넣으 십시오 스크립트 시작 부분
PATH=$PATH:.

에 Shebang ( #!/bin/bash) 줄 을 추가 하고 스크립트를 실행 가능하게 만드십시오 (을 사용하여 chmod +x <File Name>).


0

다음은 아이디어와 자동화를 제공하는 백업 스크립트입니다.

서버 : 우분투 16.04 PHP : 7.0 Apache2, MySQL 등 ...

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

/ home / user를 사용자 디렉토리로 변경하고 다음을 입력하십시오 : 스크립트의 실행을 위해 터미널의 아무 곳 이나 backupscript ! (/ usr / bin이 경로에 있다고 가정)


0

"#!/bin/sh"스크립트 전에 입력하십시오 . 그런 다음 script.sh예를 들어 저장하십시오 . 그것을 복사 $HOME/bin 하거나 $HOME/usr/bin
디렉토리는 다른 리눅스 배포판에서 다를 수 있지만 'bin' 홈 디렉토리 cd $HOME/bin 또는 $HOME/usr/bin
유형으로 끝나고 터미널 chmod 700 script.sh
에 입력하기 만하면 실행할 수 있습니다 run.sh. 작동하지 않으면 chmod +x run.sh 대신 시도하십시오 chmod 700 run.sh


이 답변에서 아주 오래된 기존 답변의 정보를 다시 말하지 않는 부분은 혼란스러워합니다.
tripleee

0

모든 파일을 실행 가능하게 만들기


migrate_linux_amd64라는 실행 파일이 있고 "migrate"와 같은 명령으로이 파일을 실행하려고한다고 가정하겠습니다.

  1. 먼저 파일 위치에서 실행 파일을 테스트하십시오.
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. 확인하여 파일에 실행 권한이
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    아닌 경우 실행chmod +x migrate.linux-amd64

  2. 그런 다음 파일을에 복사하십시오 /usr/local/bin. 이 디렉토리는 root가 소유하고 sudo를 사용하거나 root로 전환하여 다음 작업을 수행합니다.

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. 그런 다음 아래와 같은 기호 링크를 작성하십시오.
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. 마지막으로 / usr / local / bin을 경로 또는 사용자 프로필에 추가하십시오
export PATH = $PATH:/usr/local/bin
  1. 그런 다음 "migrate"로 명령을 실행하십시오.
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.