작업 중 하나가 실행 중인 디렉터리로 디렉터리를 빠르게 변경하는 방법이 있습니까?

작업 중 하나가 실행 중인 디렉터리로 디렉터리를 빠르게 변경하는 방법이 있습니까?

출력은 jobs다음과 같습니다

[1]   Stopped                 TERM=xterm-256color vim --servername vim ~/.gitconfig
[2]-  Stopped                 TERM=xterm-256color vim --servername vim ~/.vimrc  (wd: ~)
[3]+  Stopped                 TERM=xterm-256color vim --servername vim i3blocks.conf  (wd: ~/.config/i3/configs)

섹션(있는 경우)이 표시되는 위치(wd: path)path해당 작업이 실행되는 디렉터리입니다.

나는 그 디렉토리로 이동하여 그 직업 중 하나를 수행하는 것에 대해 여러 번 생각했습니다.

이 작업을 수행하는 유틸리티가 있나요?

답변1

에서는 연관 배열 zsh$jobdirs작업 번호를 해당 작업이 시작된 작업 디렉토리에 매핑하므로 작업 n의 디렉토리 cd $jobdirs[n]로 이동할 수 있습니다(또는 작업이 존재하지 않는 경우 집으로 돌아가는 대신 오류가 발생함).cdcd ${jobdirs[n]?}

~$ jobs -d
[1]  - running    sleep 1000
(pwd : /tmp)
[2]  + suspended  sleep 123123
(pwd : /usr/local)
~$ cd $jobdirs[2]
/usr/local$

또한 각 작업의 상태 및 코드에 대한 연관 배열을 참조 $jobstates하세요 .$jobtexts

에서 bash유일한 옵션은 작업의 출력을 구문 분석하는 것인데, 이는 불행하게도 경험적 방법을 통해서만 수행할 수 있습니다. 예를 들어 다음을 참조하세요.

bash-5.1$ mkdir ') (wd: blah blah)
[5] (wd: blah blih)
'
bash-5.1$ cd ') (wd: blah blah)
[5] (wd: blah blih)
'
bash-5.1$ sh -c 'sleep inf' '(wd: /etc)
[2] (wd: bloh bloh)
'
^Z
[1]+  Stopped                 sh -c 'sleep inf' '(wd: /etc)
[2] (wd: bloh bloh)
'
bash-5.1$ jobs 1
[1]+  Stopped                 sh -c 'sleep inf' '(wd: /etc)
[2] (wd: bloh bloh)
'
bash-5.1$ cd /
bash-5.1$ jobs 1
[1]+  Stopped                 sh -c 'sleep inf' '(wd: /etc)
[2] (wd: bloh bloh)
'  (wd: ~/1/) (wd: blah blah)
[5] (wd: blah blih)
)

(wd:...)작업 디렉터리가 현재 작업 디렉터리가 아닌 경우에만 인쇄된다는 점과 작업의 명령줄이나 작업 디렉터리에 s가 ​​포함된 경우 어느 s가 실제 작업 디렉터리의 시작인지 (wd: ...) 알 수 있는 방법이 없다는 것을 알 수 있습니다 .(wd:

또한 홈 디렉토리를 ~.

또한 wd:현지화되어 있습니다. 예를 들어 우크라이나어에서는 다음과 같습니다.

bash-5.1$ LC_ALL=uk_UA.utf8 jobs 1
[1]+  Зупинено        sh -c 'sleep inf' '(wd: /etc)
[2] (wd: bloh bloh)
'  (РД: ~/1/) (wd: blah blah)
[5] (wd: blah blih)
)

jobs따라서 예상하는 해당 로케일에서 호출 해야 합니다 .작업 목록약어.

당신이 할 수 있는 일은 경험적 방법을 사용하고 최선을 다하는 것뿐입니다.

cdj() {
  local dir
  dir=$(LC_ALL=C jobs -- "$1") || return
  case $dir in
    (*'(wd:'*')')
      dir=${dir%')'}
      dir=${dir##*'(wd: '}
      case $dir in
        ('~'*) dir=$HOME${dir#'~'}
      esac
      printf >&2 '%s\n' "Job $1's dir is likely \"$dir\""
      cd -- "$dir";;
    (*)
      printf >&2 '%s\n' "Job $1's dir is likely the current directory already"
  esac
}

위에서 디자인한 예제에서는 실패했지만 대부분의 일반적인 상황에서는 작동합니다.

답변2

이제 내에서 다음 함수를 정의하는 문제를 해결했습니다 ~/.bashrc.

cdj () {
  jobNumber="$1"
  dir="$(jobs | grep "^\[$jobNumber\]" | sed 's/.*(wd: \(.*\))/\1/;t;d')"
  [[ -n "$dir" ]] && eval "cd $dir"
}

이렇게 하면 존재하지 않는 작업이나 현재 디렉터리에서 실행되는 작업 수를 전달하는 경우 이 작업을 수행하고 (의도적으로) 실패할 수 있습니다.cd job-number

관련 정보