./test가 아닌 .test로 실행


26

실행 파일과 같은 폴더에 있다고 가정하면 이것을 입력하여 실행해야합니다.

./file

입력 /하기 /가 어렵 기 때문에 입력 할 필요가 없습니다 .

파일을 더 쉽게 실행할 수있는 방법이 있습니까? 이상적으로는 다음과 같은 간단한 구문이 이상적입니다.

.file

또는 다른 것이 있지만 /거기 에 문자 를 삽입하는 것보다 쉽습니다 .

아마도 /bin디렉토리 에 무언가를 넣거나 인터프리터의 별칭을 만들어서 사용할 수있는 방법이있을 수 있습니다.

p file

9
아마도 xmodmap을 사용하여 다른 키로 바꾸거나? 최소한 타이핑하는 것이 더 쉽습니다
Guy

26
참고 로 Unix에서는 주로 디렉토리 구분 기호로 광범위하게/ 사용됩니다 . 입력하기 쉬운 방법을 찾는 것이 좋습니다.
chrylis

7
@RossPresser이 질문은 이후로 거의 이해가되지 않습니다. ./는 파일의 시작 부분에 초보자가 알아야 할 기술적 이유로 완전히 다른 두 가지 의미가 있습니다. /대부분의 사람들이 타이핑하는 것은 어렵지 않으며 OP가 이것을 막는 부상을 입으면 /터미널에있는 동안 완전히 피할 수있는 방법이 없기 때문에 대체 키보드 레이아웃을 고려해야 합니다.
JFA

1
@JFA 유럽 대륙과 남미에서 사용되는 대부분의 키보드 레이아웃 /은 shift-7을 사용하여 부상 없이도 입력하기가 비교적 어렵습니다.
nitro2k01

6
히스토리 편집 : " 포트 22에서 ssh를 통해 원격 호스트를 통해 모든 인터넷 쿼리를 수행하도록 네트워크 인터페이스에 지시하는 이유는 무엇 입니까
Derek 朕 會 功夫

답변:


35

"위험"일 수 있지만 그냥 가질 수 있습니다. 당신의 경로에.

다른 사람들이 말했듯이 이것은 위험 할 수 있으므로 항상 확인하십시오. 시작이 아닌 PATH 끝에 있습니다.


1
그것이 어떻게 "위험한"지 실제로 보지 마라. 나의 길은 리눅스 이전부터 그렇게 길었고, 가장 작은 문제를 일으키지 않았다.
jamesqf

21
@jamesqf cd쓰기 가능한 디렉토리에 경로에없는 명령을 사용하려고하면 누군가 해당 경로에 작성한 것과 같은 이름으로 (악의적 인) 실행 파일을 실행할 수 있기 때문에 위험 합니다. .경로의 시작 부분에 넣으면 훨씬 더 나쁩니다 . 이 경우 해당 디렉토리에서 ls호출을 시도하면 악의적 인 실행 파일 이 실행됩니다 ls.
바이트 크기

2
위에서 지정한 이유로 이것을 피하십시오. p명령은 더 좋을 것이다.
Guido

11
@jamesqf "귀하의"시스템 일 때만 사용하면 나쁘지 않습니다. 다중 사용자 시스템에서 문제가 왔습니다. A의 .초기에 PATH, 할 수있는 모든 악의적 인 사용자의 요구는 가짜 드롭입니다 ls"뭔가 이상한 봐"에 관리자를 자신의 디렉토리에 명령을 설득하고 루트 액세스 권한을 가지고있다.
TripeHound

1
test문제의 제목과 같이 파일의 이름이 인 경우 작동하지 않지만 좋은 해결책입니다 ( test쉘이 내장되어 있기 때문에 $PATH이미 어딘가에있을 수도 있습니다 ).
yellowantphil

71

../적어도 현대 Bash 쉘에서는 자동 완성 (을 입력 .하고 누름 Tab)하므로 복잡하거나 안전하지 않은 ( PATH수정 과 같은 ) 솔루션 을 사용할 필요가 없습니다 .

자동 완성되지 않으면 "bash-completion"패키지를 설치해야합니다.


확실합니까? (현재 dir), (부모 dir), 명령 (비표준 별칭 을 제공하는 bash ) 및 존재하는 도트 파일 등 .여러 완료 후보가 있습니다. 패키지가 이것을 무시할 수도 있습니다 . 나는 귀찮게 짜증나게합니다 (예 : 명령 줄 에서 dir 이름을 탭 완성하는 것이 불가능하고 일반적으로 암시 적 규칙으로 가득 찬 makefile로 끔찍합니다). ....sourcebash-completionmake
R ..

3
나는 그것을 시도했고, 그렇습니다.이 방법으로 자동 완성됩니다. 거의 모든 경우에 일반 사용자가 원하는 것입니다. 실행 가능한 도트 파일을 본 적이 없다고 생각합니다. 하위 디렉토리에서 무언가를 실행하는 것이 부모 디렉토리에서 무언가를 실행하는 것보다 훨씬 일반적입니다. make목표물 을 찾는 데 능숙 합니다
l0b0

bash 3.2에서는 자동 완성되지 않습니다. 이것은 bash 4에서 새로운 것일 수 있습니까?
Calimo

2
@Calimo 최근 버전의 bash-completion에서 새로 추가 된 것 같습니다. 근본적인 변화와는 거리가 멀다.
l0b0

42

또는 .. 아마도 해석기에 bashrc 파일에 별명을 부여한 다음 간단히

   p  file

그러한 함수를 작성할 수 있습니다 :

p() {
 ./"$@"
}

당신의 ~/.bashrc. 그런 다음 p app arguments대신 실행할 수 있습니다 ./app arguments. 이 솔루션은 스크립트 및 바이너리를 포함한 모든 유형의 실행 파일에 적용됩니다.

"$@"함수에 전달 된 적절하게 인용 된 인수 목록으로 확장하고 (글로브 또는 변수 확장에서 모든 특수 문자를 유지) @Scott이 지적했듯이 @Scott이 지적했듯이 나머지를 보존하기 위해 첫 번째 문자 bash앞에 붙일만큼 영리 ./합니다.


strace -f p app시스템 호출 $(which time) p app을 확인 하거나 시간이 얼마나 걸리는지 확인하는 등 다른 명령으로 앱을 실행하는 것은 일반적이지 않습니다 . p실행 가능한 스크립트로 내가 생각한이 두 가지 구체적인 예에서 더 잘 작동합니다. 어느 솔루션과 함께 일할 수 ldd p app이기는하지만, ldd 또한 전체 경로를 필요에 차이가 아마도 이런 이유.
sourcejedi

예, 교체 p app args./app args전처리 어떤 종류의를 통해 쉘 입력 배관 필요 사람에게 보이지 않는 및 대체가 : 의도하지 않은 곳에서 발생했을 때 재미를 모든 종류의 원인이 방법으로
aitap

1
이 경우 따옴표가 없어야 $@합니까? 그렇지 않으면 하나의 큰 인수를 프로그램에 전달합니다.
Kroltan

7
@Kroltan No. $@는 배열입니다. 내 "에서 확장 되면 각 매개 변수가 별도의 단어로 확장됩니다. $*당신이 생각하는 방식으로 행동합니다.
8bittree

3
나는 당신이 이것을 불필요하게 복잡하게 만들었다 고 믿습니다. 그것이 당신이 p() { ./"$@"; }필요한 전부입니다.
Scott

11

당신은 넣을 수있는 .당신에게 $PATH예를 추가하여 PATH=$PATH:.당신에게 /etc/profile, 당신이 실행할 수있는이 방법 file만 쓰기로를 file이 경로 (예에서 다른 폴더에있는 경우를 제외하고 /usr/bin/). 이것은 일반적으로 좋은 생각이 아닙니다.

나쁜 이유 : 디렉토리의 내용을 완전히 신뢰하지 않는 상황에 있다고 가정하십시오. 디렉토리에서 파일을 다운로드하여 실행하기 전에 조사하고 싶거나 시스템 관리자가 일부를 돕는 경우 사용자는 자신의 홈 디렉토리를 살펴 보는 등의 방법으로 디렉토리를 나열하려고합니다. 따라서 ls를 입력하려고 시도하지만 죄송합니다. 오타를 작성하면 대신 sl을 입력하게됩니다. 이 악의적 인 디렉토리의 저자는 이것을 예상하고 'rm -rf --no-preserve-root /'(또는 루트킷 설치와 같은 악의적 인)를 실행하는 "sl"이라는 쉘 스크립트를 넣었습니다.

(설명 해주신 @Muzer에게 감사드립니다)


13
나는 전적으로 동의하지만, 이것이 왜 이것이 좋은 생각이 아닌지를 정확하게 설명하는 것입니다.
ymbirtt

16
나쁜 이유 : 디렉토리의 내용을 완전히 신뢰하지 않는 상황에 있다고 가정하십시오. 디렉토리에서 파일을 다운로드하여 실행하기 전에 조사하고 싶거나 시스템 관리자가 일부를 돕는 경우 사용자는 자신의 홈 디렉토리를 살펴 보는 등의 방법으로 디렉토리를 나열하려고합니다. 따라서 ls를 입력하려고 시도하지만 죄송합니다. 오타를 작성하면 대신 sl을 입력하게됩니다. 이 악의적 인 디렉토리의 저자는 이것을 예상하고 'rm -rf --no-preserve-root /'(또는 루트킷 설치와 같은 악의적 인)를 실행하는 "sl"이라는 쉘 스크립트를 넣었습니다.
Muzer

2
만약 현재 디렉토리가 $ PATH의 시작 부분에 있다면, 공격자는 ls 또는 다른 일반적인 명령을 무시할 수 있다고 설명 할 가치가 있습니다
Délisson Junio

@Muzer Huuuge 은박지 모자 여기에.
솜브레로 치킨

4
@GillBates 실제로 악의적 인 사용자를 처리해야하는 sysadmin이나 생계를 위해 의심스러운 아카이브를 분석하는 사람은 조심해야합니다. 둘 중 어느 것도 해당되지 않으면 동의합니다. 그래도 상황이 바뀔 때를 절대 알지 못하기 때문에 이러한 직업 중 하나를 얻지 못하기 때문에 안전하지 않은 행동에 의지하도록 자신을 훈련시킨 것에 대해 스스로 저주 할 것입니다. )
Muzer

10

예를 들어 통역사에게 전화 할 수 있습니다.

bash test

이 경우 스크립트에 shebang 줄 (예 :) #!/bin/bash이나 실행 가능한 비트 가없는 경우에도 스크립트가 실행됩니다 . 올바른 인터프리터도 실행해야합니다. 예를 들어 shebang 행이 다음과 같은 경우 파일의 shebang 행을 먼저 읽고 올바른 인터프리터를 호출 할 수 있습니다.

#!/usr/bin/env python3

당신은 전화 할 것이다

python3 test

7
인터프리터는 코드를 해석하기 만하면 바이너리 파일을 실행하지 않습니다
Mc Kernel

이 해석은 아마도 bashrc 파일에서 해석기에 별명을 부여 할 수 있기 때문에 다소 논리적입니다.

5
@McKernel 좋은 점은 컴파일 된 실행 파일이 아닌 인터프리터가있는 경우에만 작동합니다.
Zanna

2
컴파일 된 실행 파일에 대한 인터프리터가 있습니다 :/lib/ld.so
Dmitry Kudriavtsev

7

내가 아는 한, env 경로에 파일을 포함시키지 않으면 파일을 얻을 수있는 방법이 없으므로 다음을 입력하여 실행할 수 있습니다. file

.file다른 파일 이름이므로 작동하지 않습니다. 이 .file아니라 라는 파일 ./file입니다.

영어 이외의 레이아웃으로 인해 슬래시를 입력하기 어려울 수 있습니다. 이 경우 나에게도 발생하므로 Windows에서 Alt + Shift를 눌러 키보드 레이아웃을 영어로 자주 교체합니다 (ssh에서 Linux를 사용합니다)


7

사람들은에 추가 .를 제안 PATH했습니다.이 경우 위험 할 수 있습니다.이 파일은 실수로 세계 기록 가능한 디렉토리에 설치된 악성 프로그램을 실행할 위험이 있습니다. 당신은 당신이 소유 몇 디렉토리에 실행 프로그램을 가지고 만 쓰기 권한이있는 경우 그러나, 그것은 안전 (매우 안전?)입니다 넣어 그 이사 (들)을PATH같은 줄을 추가하여,

PATH=$PATH:~/dev/myprog1:~/dev/myprog2

당신에 ~/.bashrc파일. 물론 이것은 파일 시스템의 어느 곳에서나 해당 디렉토리 중 하나에서 프로그램을 실행할 수 있음을 의미합니다. 예를 들어,을 cd /etc입력 foo하고 실행할 수 있습니다 ~/dev/myprog1/foo. 이것은 하나 이상의 디렉토리에 같은 이름의 프로그램을 가질 수 없다는 사소한 단점이 있습니다. 특히 및 foo 에서 호출 된 프로그램이있는 경우 경로를 지정하지 않으면 두 번째 프로그램을 실행할 수 없습니다. 마찬가지로 당신이 -하지만 왜 당신이 원하십니까?~/dev/myprog1~/dev/myprog2~/dev/myprog1/cat


이 작업을 수행하는 프로그램이 몇 개인 경우 다른 접근 방식은 해당 프로그램의 별명을 정의하는 것입니다.

alias gizmo='./gizmo'
alias gonzo='./gonzo'

아니면 별칭을 호출 할 수 있습니다 .gizmo그리고 .gonzo 당신이 경우 그보다 직관적를 찾을 수 있습니다.

실제로 이것은 어느 정도까지는 보안 위험 .이 있습니다 PATH. 악의적 인 사용자가 사용자를 읽고 .bashrc별명을 볼 수 있다면, 사용자가 원하는 대로 멀웨어 gizmogonzo임의의 디렉토리에 맬웨어를 넣을 수 있습니다 . 이 경로를 절대 경로 이름으로 사용하는 것이 좋습니다.

alias gizmo='~/dev/myprog1/gizmo'
alias gonzo='~/dev/myprog2/gonzo'

그건 그렇고, 실행 파일 test은 셸 내장 명령이기 때문에 실행 파일 이름을 피해야 하며 경로 또는 다른 트릭을 지정해야만 해당 이름으로 프로그램을 실행할 수 있습니다.


또는 당신은 조리법을 (당신이 메이크 파일을 사용하는 경우입니다) 그리고 할 수있는 make gizmomake gonzo.
ihato

죄송하지만 질문이나 답변과 관련이 있는지 잘 모르겠습니다. OP Makefile가 각 디렉토리에 a 를 작성하여 make gizmo종료 조치 가 실행 되도록 제안하고 gizmo있습니까? (1) 그것은 p질문에서 제안되고, 처음 에 aitap의해 구현되고 , Scott에 의해 개선 된 기능 과 같은 일을하는 어색한 방법 인 것 같습니다 . (2) 그런 식으로 논쟁을 전달할 수 있습니까? ISTM make gizmo arg1 arg2과 같습니다 make gizmo; make arg1; make arg2.
G-Man, 'Reinstate

1
(1) 아마도 내 가정은 잘못이지만 나에게 OP 사용에서 피하다 원하는 명확하지 않다 ./에서 모든 디렉토리를 . 내 마음에, 그는 무언가를 개발하고 있으며 생산 된 프로그램을 ./file자주 실행해야합니다 . (그는 말했다 정말 일이 자주 로컬 파일을 실행해야 다른 시나리오를 생각할 수 없다 그가 그것을 실행되고 있지 않으면 자주 자신이 질문을 귀찮게하지 않는 게 좋을 어려운 되지 불가능 ) (2) 정말 하지만, 레시피에서 인수를 전달할 수 있습니다.
ihato

(1) OP의 동기와 그의 질문의 범위가 불분명하다는 데 동의 할 수 있습니다. (2) 링크 주셔서 감사합니다.
G-Man, 'Reinstate

3

인터프리터에 대한 Zanna의 답변을 확장하려면 (죄송합니다, 코멘트에 대한 답장이 없습니다) : 네이티브 실행 파일 (일명 이진 ELF 파일)의 "인터프리터"는 동적 로더 ( ld.so)이지만 일반적으로 원하는 구문을 이해하지 못합니다.

$ /usr/lib/ld-linux-x86-64.so.2 program
program: error while loading shared libraries: program: cannot open shared object file
$ /usr/lib/ld-linux-x86-64.so.2 ./program
<program is launched>

(또한 ld.so경로에 심볼릭 링크 가 없으면 /s 를 작성해야합니다 )


이것은 리눅스에 특정한 것입니까? 이것을 더 설명해 주시겠습니까? 왜 이것이 효과가 있습니까? 나는 (Linux) 커널이 파싱을 수행하고 바이너리를 실행할지 여부와 방법을 결정할 것이라고 생각했다 binfmt_misc.
phk

2
@phk 파일은 Linux에 따라 다르지만 동적 링커 / 로더의 개념은 아닙니다. 예를 들어, FreeBSD는 고유 한을 가지고 /libexec/ld-elf.so.1있습니다. Linux에서는 "바이너리 실행 방법 결정"만큼 간단하지 않습니다. binfmt_misc마법 번호 (ELF, shebang 스크립트, CIL)로 파일 형식을 감지합니다. 그 후, binfmt_elf핸들러가 호출됩니다. ELF 헤더와 섹션을 구문 분석합니다. .interp섹션은 동적 로더의 경로를 포함합니다. 이 로더는 커널에 의해 시작되고 재배치하고로 이동합니다 _start. FreeBSD (다른 사람들에 대해서는 확실하지 않음)에는 binfmt가 없지만 그 원리는 +/-와 비슷합니다.
베이컨 드롭 17

1
왜 이것이 작동하는지에 대해 @phk- 정적으로 연결되어 ld.so있지 않으며 .interp정적으로 연결되어 있으므로 다른 동적 링커 / 로더가 외부 심볼을 ​​해결하고 재배치 수학을 수행 할 필요가 없습니다.
베이컨 드롭 17

ISTR Solaris에도 이와 동등한 것이 있습니다.
G-Man, 'Reinstate

3

구성을 시작할 수 있다면

mkdir -p ~/.local/bin
cat > ~/.local/bin/x << 'EOF'
#!/bin/sh
N="$1"
shift
exec "./$N" "$@"
EOF
chmod a+x ~/.local/bin/x

대부분의 최신 배포판은 이미 (추가 $ PATH에 ~ / .local의 / bin이 포함 export PATH="$HOME/.local/bin:$PATH"~/.profile당신이하지 않는 경우). 그런 다음을 사용 x file하여 실행할 수 있습니다 ./file.

.명령 을 정의하려고하지 마십시오 . 명령은 . script이미 script현재 쉘에서 실행됩니다 . script현재 쉘에 대한 환경 변수를 정의 할 수 있습니다 .


3
나는 여기에 좋은 제안이있을 것이라고 생각하지만, 이것이 무엇을하는지에 대한 설명은 없습니다. 나는 그것을 해결할 수는 있지만 경험이없는 사용자는 기회가 없을 것입니다.
IMSoP

1 달러를 옮길 필요가 없습니다. 그냥 exec "$@".
reinierpost 2012

$ (ln -s /bin/ls my-ls && exec my-ls) # bash: exec: my-ls: not found
sourcejedi 2012

(1) 필요가 없습니다 shift $1; 그냥 exec ./"$@". (2) 쉘 스크립트에 대해 이야기하고 있기 때문에 .라는 파일을 만들 수 없기 때문에 사람들에게 명령 을 정의하지 말라고 조언하는 것은 의미가 없습니다 .. (라고하는 별칭 또는 쉘 함수를 정의하는 것은 매우 바람직하지 않습니다 ..)
Scott

1

도우미 스크립트를 만들 수 있다면 pwd를 PATH에 추가하는 도우미를 만들고

. pathhelper    #adds pwd to path
file            #now it can be run without ./

"."를 추가하지 않아도됩니다. 어떤 경로에서 무언가를 실행하려는 모든 경로로 .profile을 오염시킵니다.

수정 된 PATH로 새 쉘을 시작하는 도우미를 만들어이 접근 방식을 한 단계 더 발전시킬 수 있습니다. pwd를 기본값으로 사용하여 디렉토리를 매개 변수로 사용하는 pushd경우 경로를 편집하는 것과 같은 기능을 합니다. 서브 쉘을 종료 할 때 다른 환경 변수에 대한 변경 사항은 유실 될 수 있지만 장기 실행 쉘에서는 PATH 변수가 모두 어지럽히지는 않습니다. 워크 플로우에 따라이 방법이 유리할 수 있습니다.

:outer shell prompt$; subshellpathhelper    # launches a subshell with modified PATH
: subshell prompt $ ; file                  # in the subshell it can be run without ./

그러나 나는 당신이 그것을 실행하기를 원한다면 당신은 해킹 수도 있겠죠 pushdpopd그들이 다른 변경 사항을 잃게됩니다 서브 쉘을하지 않고 경로에 동일한 수정을 할 수 있습니다.

pushd --path ~/some/path/    # normal pushd plus adds target to path
file                         # it can be run without ./ until you popd

(에 cd대한 아날로그가 없기 때문에 동일한 작업을 수행 할 수 없습니다 popd.)

PATH 항목을 푸시하고 팝업하기 위해 전용 도우미 쌍을 만들 수도 있습니다. 가장 잘 작동하는 것은 사용 패턴에 따라 다릅니다.


실제로, 당신은에서와 같은 것을 할 수는 cd있지만 더 나아갈 것입니다 : 같은 파일 을 만들고 전환 직전 에 사용할 수없는 것으로 정의 된 명령 을 전환하고 전환 직후 에 사용할 수 있도록 .dircmds해킹 cd하십시오 ./.dircmds.
ShadSterling

-1

. script.sh실행하려는 스크립트가 현재 디렉토리에있는 한 구문을 사용할 수 있습니다 .

sh 또는 bash와 같은 인터프리터를 접두사로 사용할 수도 있습니다. 예:bash script.sh


8
. script.sh스크립트에가 포함되어 있으면 exit예기치 않은 영향을 미칩니다. 또한 현재 쉘의 스크립트에서만 작동합니다.
sourcejedi

@sourcejedi exit서브 쉘과 같이 괄호 안에 넣을 수는 있지만 같은 쉘의 스크립트에만 해당됩니다.
phk

질문은 "실행 파일"이라고 말합니다. 바이너리 실행 파일에서는 작동하지 않습니다. 스크립트에만 해당됩니다. 그리고 두 번째 단락은 Zanna의 답변을 복제 합니다.
Scott

글쎄, 내 나쁜, 나는 주로 bash 물건을 실행하고 개발했다. 그래서 나는 bash 스크립트에 대해 이야기하고 있다고 가정했다. :)
UltimateByte

스크립트뿐만 아니라 Bash 스크립트만을위한 것입니다.
Oskar Skog
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.