Bash

有沒有一種方法可以快速將 dir 更改為其中一個作業正在執行的位置?

  • March 11, 2022

的輸出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

有幾次我想搬到那個目錄來做一份工作。

有這樣做的實用程序嗎?

zsh中,$jobdirs關聯數組將作業編號映射到它們開始的工作目錄,因此您可以將cd $jobdirs[n]tocd放入作業 n 的目錄(或者cd ${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:...)僅當作業的 dir 不是目前工作目錄時才會列印,並且如果作業的命令行或工作目錄恰好包含(wd: ...) ,則無法判斷哪個(wd:s 是實際工作目錄的開始。

還將您的主目錄替換為~.

還要注意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
}

在我們上面的人為範例中失敗了,但在大多數正常情況下應該可以工作。

引用自:https://unix.stackexchange.com/questions/694036