Есть ли разумный способ реализовать команду cd на виртуальных машинах?

StackOverflow https://stackoverflow.com/questions/130640

  •  02-07-2019
  •  | 
  •  

Вопрос

Я хотел бы иметь возможность говорить такие вещи, как

компакт-диск [.fred] и пусть мой каталог по умолчанию будет там, и мое приглашение изменится, чтобы указать полный путь к моему текущему местоположению.

Это было полезно?

Решение

Вот моя установка:

Вам понадобятся 2 файла (введите их ниже). :godir.com и prompt.com в вашем системном логине

Вы можете определить символ

CD == "@sys$login:godir.com"

Но я предлагаю вам использовать что-то другое...(т.е. SD == "@sys$login:godir.com")

Я изменяю текст справки.Оно было на французском...

Вам нужно будет повторно ввести символы escape в godir.com Замените ESC на реальный escape в GRAPH_BOUCLE:(см. нижнюю часть godir.com)

Затем, чтобы использовать его:

SD ?
SD a_directory
...

Надеюсь, это поможет.


Вот prompt.com

$       noeud   = f$trnlnm("SYS$NODE") - "::"
$       if noeud .eqs. "HQSVYC" then noeud = "¥"
$!
$       noeud = noeud - "MQO"
$       def_dir = f$directory()
$       def_dir = f$extract(1,f$length(def_dir)-2,def_dir)
$boucle:
$       i = f$locate(".",def_dir)
$       if i .eq. f$length(def_dir) then goto fin_boucle
$       def_dir = f$extract(i+1,f$length(def_dir)-1,def_dir)
$       goto boucle
$!
$fin_boucle:
$!      temp = "''noeud' ''def_dir' " + "''car_prompt'"
$       temp = "''noeud'" -
             + " ''def_dir' " -
             + "''f$logical(""environnement"")'" -
             + "''car_prompt'"
$!      temp = "''noeud'" -
$!           + "''def_dir'" -
$!           + "''f$logical(""environnement"")'" -
$!           + "''car_prompt'"
$       set prompt="''temp' "
$!
$! PROMPT.COM
$!

Вот godir.com

$!
$! GODIR.COM
$!
$       set noon
$       set_prompt = "@sys$login:prompt.com"
$       if f$type(TAB_DIR_N) .nes. "" then goto 10$
$       goto 20$
$ INIT:
$       temp2 = "INIT"
$ CLEAR:
$       temp = 0
$
$ INIT2:
$       temp = temp +1
$       if temp .gt. TAB_DIR_N then goto INIT3
$       delete/symb/glo TAB_DIR_'temp'
$       goto INIT2
$
$ INIT3:
$       P1 = ""
$       if temp2 .eqs. "INIT" then goto 20$
$       delete/symb/glo TAB_DIR_N
$       delete/symb/glo TAB_DIR_P
$       delete/symb/glo TAB_DIR_I
$       exit
$
$ 20$:
$       TAB_DIR_N == 1
$       TAB_DIR_P == 1
$       TAB_DIR_I == 1
$       if "''car_prompt'" .eqs. "" then car_prompt == ">"
$       TAB_DIR_1 == f$parse(f$dir(),,,"device")+f$dir()
$ 10$:
$       if P1 .eqs. ""  then goto LIST
$       if P1 .eqs. "?" then goto SHOW
$       if P1 .eqs. "." then P1 = "[]"
$       if P1 .eqs. "^" then goto SET_CUR
$       if (P1 .eqs. "<") .or. (P1 .eqs. ">") .or. -
           (P1 .eqs. "..") then P1 = "[-]"
$       if (P1 .eqs. "*") .or. (P1 .eqs. "0") then goto HOME
$       if (P1 .eqs. "P") .or. (P1 .eqs. "p") then goto PREVIOUS
$       if (P1 .eqs. "H") .or. (P1 .eqs. "h") then goto HELP
$       if (P1 .eqs. "S") .or. (P1 .eqs. "s") then goto SET_PROMPT
$       if (P1 .eqs. "G") .or. (P1 .eqs. "g") then goto SET_PROMPT_GRAPHIC
$       temp2 = ""
$       if (P1 .eqs. "~INIT")  .or. (P1 .eqs. "~init")  then goto INIT
$       if (P1 .eqs. "~CLEAR") .or. (P1 .eqs. "~clear") then goto CLEAR
$
$!      *** Specification par un numero
$       temp = f$extract(0,1,P1)
$       if temp .eqs. "-" then goto DELETE
$       temp2 = ""
$boucle_reculer:
$       if temp .nes. "\" then goto fin_reculer
$       temp2 = temp2 + "-."
$       P1 = P1 - "\"
$       temp = f$extract(0,1,P1)
$       goto boucle_reculer
$!
$fin_reculer:
$       P1 = temp2 + P1
$       if (P1 .lts. "0") .or. (P1 .gts. "9") then goto SPEC
$       temp = f$integer("''P1'")
$       if temp .eq. 0 then goto HOME
$       if (temp .lt. 1) .or. (temp .gt. TAB_DIR_N) then goto ERR
$       TAB_DIR_P == TAB_DIR_I
$       TAB_DIR_I == temp
$       goto SET2
$
$ SPEC:
$!      *** Specification relative de directory
$
$       temp = f$parse("[.''P1']","missing.mis")
$       DD = f$extract(0,f$locate("]",temp)+1,temp)
$       if DD .nes. "" then goto SET1
$
$!      *** Specification de directory principal
$
$       temp = f$parse("[''P1']","missing.mis")
$       DD = f$extract(0,f$locate("]",temp)+1,temp)
$       if DD .nes. "" then goto SET1
$
$       temp = f$parse("[''P1']","sys$login:missing.mis")
$       DD = f$extract(0,f$locate("]",temp)+1,temp)
$       if DD .nes. "" then goto SET1
$
$!      *** Specification exacte de directory
$
$       temp = f$parse(P1,"missing.mis")
$       if f$locate("]"+P1,temp) .ne. f$length(temp) then goto ERR
$       if f$locate(".][",temp) .ne. f$length(temp) then temp = temp - "]["
$       DD = f$extract(0,f$locate("]",temp)+1,temp)
$!      if DD .eqs. TAB_DIR_'TAB_DIR_I' then goto SHOW
$       if DD .eqs. TAB_DIR_'TAB_DIR_I' then goto SET2
$       if DD .nes. "" then goto SET1
$
$       temp = f$parse(P1,"sys$login:missing.mis")
$       if f$locate("]"+P1,temp) .ne. f$length(temp) then goto ERR
$       if f$locate(".][",temp) .ne. f$length(temp) then temp = temp - "]["
$       DD = f$extract(0,f$locate("]",temp)+1,temp)
$!      if DD .eqs. TAB_DIR_'TAB_DIR_I' then goto SHOW
$       if DD .eqs. TAB_DIR_'TAB_DIR_I' then goto SET2
$       if DD .nes. "" then goto SET1
$
$       goto ERR
$
$ HOME:
$       DD = "SYS$LOGIN"
$
$ SET1:
$       Set On
$       On error then goto ERR1
$       set message/nofac/noid/nosever/notext
$       Set def 'DD'
$       dir/output=nl:
$       set message/fac/id/sever/text
$       temp = f$parse(f$dir()) - ".;"
$       if temp .nes. "" then goto SET1F
$ ERR1:
$       set message/fac/id/sever/text
$       temp = TAB_DIR_'TAB_DIR_I'
$       Set def 'temp'
$       goto ERR
$ SET1F:
$       I = 0
$ LOOP1:
$       I = I + 1
$       if temp .eqs. TAB_DIR_'I' then goto FOUND
$       if I .lt. TAB_DIR_N then goto LOOP1
$
$       TAB_DIR_N == TAB_DIR_N + 1
$       TAB_DIR_P == TAB_DIR_I
$       TAB_DIR_I == TAB_DIR_N
$       TAB_DIR_'TAB_DIR_I' == temp
$       goto SHOW
$
$ FOUND:
$       TAB_DIR_P == TAB_DIR_I
$       TAB_DIR_I == I
$       goto SET2
$
$ SET_PROMPT:
$       car_prompt == "''P2'"
$       set_prompt
$       exit
$
$ PREVIOUS:
$       temp = TAB_DIR_P
$       TAB_DIR_P == TAB_DIR_I
$       TAB_DIR_I == temp
$
$ SET_CUR:
$ SET2:
$       DD = TAB_DIR_'TAB_DIR_I'
$       set def 'DD'
$
$ SHOW:
$       temp = TAB_DIR_'TAB_DIR_I'
$       ws "  ''TAB_DIR_I' * ''temp'"
$       set_prompt
$       exit
$
$ LIST:
$       I = 0
$ LOOP2:
$       I = I + 1
$       temp = TAB_DIR_'I'
$       if I .eq. TAB_DIR_I then goto L_CUR
$       if I .eq. TAB_DIR_P then GOTO L_PRE
$       ws "  ''I' = ''temp'"
$       goto F_LOOP2
$ L_CUR:
$       ws "  ''I' * ''temp'"
$       goto F_LOOP2
$ L_PRE:
$       ws "  ''I' + ''temp'"
$
$ F_LOOP2:
$       if I .lt. TAB_DIR_N then goto LOOP2
$       set_prompt
$
$       exit
$
$ DELETE:
$       P1 = P1 - "-"
$       temp2 = f$integer("''P1'")
$ DEL_1:
$       temp = f$integer("''P1'")
$       if (temp .lt. 1) .or. (temp .gt. TAB_DIR_N) then goto ERR
$       if temp .eq. TAB_DIR_I then goto ERR
$       if temp .lt. TAB_DIR_I then TAB_DIR_I == TAB_DIR_I - 1
$       if temp .eq. TAB_DIR_P then TAB_DIR_P == TAB_DIR_I
$       if temp .lt. TAB_DIR_P then TAB_DIR_P == TAB_DIR_P - 1
$ LOOP3:
$       if temp .eq. TAB_DIR_N then goto F_LOOP3
$       temp3 = temp + 1
$       TAB_DIR_'temp' == TAB_DIR_'temp3'
$       temp = temp + 1
$       goto LOOP3
$ F_LOOP3:
$       delete/symb/glo tab_dir_'tab_dir_n'
$       TAB_DIR_N == TAB_DIR_N - 1
$       if P2 .eqs. "" then goto FIN_DEL
$       temp2 = temp2 + 1
$       if temp2 .le. f$integer("''P2'") then goto DEL_1
$ FIN_DEL:
$       goto LIST
$
$ ERR:
$       ws "*** ERREUR ***"
$       exit
$
$ HELP:
$       ws "    H       Show this menu"
$       ws "    null    Show a list of directories"
$       ws "    ?       Show current directory"
$       ws "    < or [-] or"
$       ws "    > or .. Remonte d'un niveau de directory"
$       ws "    * ou 0  Return to SYS$LOGIN"
$       ws "    P       Last directory "
$       ws "    . ou [] Set cureent directory"
$       ws "    ^       Return to next directory"
$       ws "    x       Set def to number x"
$       ws "    -x      Remove the number x"
$       ws "    -x y    Remove from x to y"
$       ws "    ddd     Set def to [ddd] or [.ddd] or ddd:"
$       ws "    \ddd    Set def to [-.ddd]"
$       ws "    S "">>""  Modify prompt for >>"
$       ws "    ~INIT   Initialize to current directory "
$       ws "            (and delete all others references)"
$       ws "    ~CLEAR  Remove all references
$       ws ""
$
$       exit
$
$ SET_PROMPT_GRAPHIC:
$       temp = "''P2'"
$       i=0
$       car_prompt == ""
$ GRAPH_BOUCLE:
$       t=f$extract(i,1,temp)
$       if (t .eqs. "e") .or. (t .eqs. "E") then t="ESC"
$       if (t .eqs. "g") .or. (t .eqs. "G") then t="ESC(0"
$       V° (} .L-_. "N") .-_. (} .L-_. "H") }NL+ }="ESC(B"
$       car_prompt == car_prompt + t
$       i = i+1
$       if i .lts. f$length(temp) then goto GRAPH_BOUCLE
$
$       set_prompt
$       exit

Другие советы

Просто введите

cd:==set default

в командной строке.Вы также можете поместить это в свой LOGIN.COM файл, но не забудьте поставить $ впереди, т.е.

$ cd:==set default

Чтобы изменить ваше приглашение так, чтобы оно отображалось по умолчанию, что-то вроде этого может работать до определенного момента

$ set prompt='f$env("default")'

Однако существует проблема с тем фактом, что приглашение виртуальной машины содержит максимум 32 символа, и ваше значение по умолчанию может быть длиннее этого.Взгляните на эта страница в поисках способа обойти эту проблему.

Мой DCL равен в самом деле расти, а ты не можешь создать псевдоним для УСТАНОВЛЕННОГО ПО УМОЛЧАНИЮ имени CD?

Используйте HGSD, который реализует команду SD (сокращение от SET DEFAULT).Просто погуглите это.Это улучшенная версия более старой реализации от Хантера Готли.

Единственное, с чем он не может справиться (пока), - это логики с несколькими переводами.В остальном это работает как шарм, и вам не нужно вводить полные имена каталогов.Вы даже можете перейти к следующему каталогу на том же уровне.

Он также может настроить приглашение, если у вас есть нужные привилегии, за один раз, так что ваше приглашение будет отражать ваш каталог по умолчанию, как в старые времена в DOS.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top