디렉토리를 변경하지 않고 어디서나 프로그램을 실행


9

현재 디렉토리를 변경하지 않고 프로그램 x를 실행하는 별칭을 만들고 싶습니다. 현재 가지고있는 것은 다음과 같습니다.

alias x = "cd /home/path_to_x && ./x"

이것은 작동하지만 디렉토리를 변경합니다. 내가하고 싶은 것은 다음과 같습니다.

alias x="./home/path_to_x/x

그러나 그런 파일이나 디렉토리가 없습니다. 아무도 이것에 대한 해결 방법을 알고 있습니까?


9
과 같은 별칭을 설정하십시오 alias x='/home/path_to_x/x'. .전에 사용하지 마십시오 /home. .(점)은 현재 디렉토리를 나타냅니다.
souravc

2
x에있는 동안 실제로 실행해야 합니까 /home/path_to_x? 아니면 특정 디렉토리에 상주하는 프로그램을 실행하는 방법이 확실하지 않습니까?
Adaephon


하나 더 유사한 질문 askubuntu.com/questions/427818/…
c0rp

답변:


13

CD는 절대 경로를 사용하여 실행하지 마십시오.

이 버전 :

cd /home/path_to_x && ./x

디렉토리를 절대 경로로 변경 /home/...한 후 (루트 디렉토리에서 시작 하는 방법 참조 ) 상대 경로 ./x(즉, 새 작업 디렉토리에 상대적인 경로) 에서 실행 파일을 실행합니다 .

이 버전 :

./home/path_to_x/x

실행 파일을 상대 경로 에서 실행하려고 시도합니다. ./home/path_to_x/x즉, 현재 작업 디렉토리가 무엇이든 관계가 있습니다 . 이 오류가 발생하는 이유를 설명합니다.이 상대 경로는 실제로 존재하지 않습니다.

원하는 명령은 다음과 같습니다.

/home/path_to_x/x

절대 경로 (루트 디렉토리에서 시작 /)를 다시 사용하십시오.

아, 그리고 당신은 또한 단지 추가 할 수 있습니다 /home/path_to_x당신에 PATH별칭을 만드는 대신. 전체 경로를 입력하지 않고 스크립트를 실행하는 방법을 참조하십시오.


이것은 제시된 질문에 대한 정답입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

1
프로그램이 제공하는 특정 디렉토리에서 프로그램을 실행해야하는 경우에만 올바르지 않습니다.pwd
Kaz Wolfe

@Whaaaaaat가 옳습니다. /home/path_to_x/x기능적으로 동등하지 않다 (cd /home/path_to_x && ./x); 작동하는지 여부는 응용 프로그램에 따라 다릅니다.
Rmano

비록 당신이 일반적으로 옳지 만,이 특정 질문에 대해 OP는 절대 경로 (한 글자 실수로)에서 눈에 띄게 실행하려고했습니다. 그러나이 경우 작업 디렉토리가 중요한지 명확히 할 수 있다고 확신합니다.
쓸모없는

8

cd별명 대체 후에 고정을 원하지 않으면 (y 와 함께 서브 쉘을 사용하십시오 ).

alias my_x="(cd /home/path_to_x && ./x)&" 

당신은 그것을 확인할 수 있습니다

alias test_y="(cd /tmp && sleep 10 ) & "

참고 솔루션

alias my_y="/home/path_to_x/x" 

정확히 동일하지 않습니다. 사실, 통해 호출하는 경우 my_xx프로그램은 현재 디렉토리에 실행 /home/path_to_x/에 의해 호출하면 동안 my_y, x명령이 하나 인 현재 디렉토리에 실행 my_y발행되었다. 이것은 무엇 x을하고 있는지에 따라 중요하거나 중요하지 않을 수 있습니다 .

[정보] OP 솔루션 , 그것은 작동합니다 bash:

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

그러나 zsh:

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A > /dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

bash와 zsh가 다른 방법으로 목록을 실행 하는 것 같습니다 ... 그래서 명시 괄호를 추가하는 것이 좋습니다 ... @ EliahKagan 감사합니다.


1
마치 고유 한 것 &보다 후행 보다 높은 우선 순위를 부여합니다 . 내가 시도 에서 , , , , , 심지어 하나의 비 Bourne의 스타일 쉘 ( ). 포 그라운드 에서만 평가 됩니다. 다른 모든 것은 즉시 반환되었습니다 ( 물론 5 초 후에 인쇄됩니다 ). 반면에 이것이 전적으로 독특하더라도 명시 적 (또는 )을 추가 하는 것은 다른 인간 (또는 나중에 대본이나 역사를 읽을 때 자신에게 의도를 전달 함)을 전달하는 것이 합리적 이라고 생각 합니다. &&zshsleep 5 && echo done &zshbashkshmkshdashtcshzshsleep 5donezsh( ){ ;}
Eliah Kagan

4

실행하려는 파일이 이미 실행 가능한 경우 PATH 변수에 추가하지 않겠습니까?

실행 파일이 /home/user/aplication/appX방금 입력 된 경우

PATH=$PATH:/home/user/application

당신에게 ~/.bashrc또는~/.profile

콘솔을 다시 시작한 후 간단하게 실행할 수 있습니다 appX

이것이 가장 깨끗한 해결책이라고 생각합니다.


3

&마지막에 a 를 넣으면 트릭을 수행하는 것 같습니다.

alias x = "cd /home/path_to_x && ./x &"

2
확실해? 실행 후에 x있습니다 /home/path_to_x. &말은 단순히 백그라운드에서 프로세스를 보냅니다.
Rmano

2
@Rmano 이것은 실제로 작동합니다. cd백그라운드 작업에서의 호출은 호출자에게 영향을 미치지 않습니다 (이것은 말이된다면 정말 이상 할 것입니다). 비동기 실행은 서브 쉘을 사용 하기 때문 입니다. 왜 이것이 효과가 있으며 무엇을하는지 설명 &하고 백그라운드에서 달리는 것이 바람직하지 않은 방법을 설명하면 더 좋을 것 입니다. (이미) 정답입니다. ( 명시 적으로 서브 쉘 만들기 ( )당신이 제안으로, 구문을 아마 더 나은 솔루션 불구하고 대부분의 시간입니다.)
엘리야 케이건

@EliahKagan 당신이 맞아요. 솔루션을 확인 zsh하고 효과적으로 작동하지만 작동 bash하지 않습니다 zsh... 별칭 확장 방법에 약간의 차이가 있어야합니다.
Rmano


@Rmano pushd에서 관련 설정을 활성화 했습니까? zsh(내가 가지고 setopt autopushd pushdsilent pushdtohome있으며 내
muru

0

현재 pwd를 백업하고 명령을 실행 한 후 마지막 pwd를 실행 취소하십시오.

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'

당신은 그 Rmano의 별칭의 효과를 오해했습니다. 명령 행이 차단되지 않습니다. 별명 ( test) 의 출력이 커서를 다음 행으로 푸시 한 것입니다. Enter 키를 눌러 새 프롬프트를 여는 것을 포함하여 원하는 모든 작업을 계속 수행 할 수 있습니다.
muru

예, 맞습니다. @mure : |
αғsнιη

큰 따옴표를 사용 하므로 별칭이 정의 될 때 변수에 현재 디렉토리가 포함 됩니다 . 별명이 확장 될 때까지 작은 따옴표를 사용하여 평가를 연기하십시오. 그러나, pushdpopd당신의 대답은 무엇을 할. alias x='pushd /home/path_to_x && ./x && popd'
추후 공지가있을 때까지 일시 중지되었습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.