Existe uma maneira razoável para implementar um comando cd em VMS?
-
02-07-2019 - |
Pergunta
Eu gostaria de ser capaz de dizer coisas como
cd [.fred] e ter o meu diretório padrão ir lá, e meu prompt de mudança para indicar o caminho completo para a minha localização atual.
Solução
Aqui está a minha configuração:
Você precisa de 2 arquivos (digitados abaixo): godir.com e prompt.com em seus sys $ login
Você pode definir um symbole
CD == "@sys$login:godir.com"
Mas eu sugiro que você use outra coisa ... (ie SD == "@ sys $ login: godir.com")
I modificar o texto de ajuda. Foi em francês ...
Você terá que digitar novamente os caracters escapar para godir.com Substitua ESC pela fuga real para GRAPH_BOUCLE: (ver parte inferior do godir.com)
Depois de usá-lo:
SD ?
SD a_directory
...
Hope isso ajuda.
Aqui está 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
$!
Aqui está 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
Outras dicas
tipo Apenas
cd:==set default
no prompt de comando. Você também pode colocar isso em seu arquivo LOGIN.COM, mas não se esqueça de colocar um $ na frente, i.
$ cd:==set default
Para alterar o seu prompt para mostrar o seu padrão, algo como isso pode funcionar até certo ponto
$ set prompt='f$env("default")'
Há um problema, porém com o facto de prompt de VMS possui um máximo de 32 caracteres, e seu padrão pode ser maior do que isso. Ter um olhar para desta página para uma maneira de contornar esse problema.
Meu DCL é realmente enferrujado, mas você não pode criar um alias para SET DEFAULT chamada CD?
Use HGSD que implementa um cartão SD (abreviação de SET DEFAULT) de comando. Apenas google. É uma versão melhorada por Hunter Goatley de uma implementação mais velho.
A única coisa que não pode lidar com (ainda), são logicals com várias traduções. Fora isso, ele funciona como um encanto, e você não precisa digitar os nomes de diretório completos. Você pode até passar para o próximo diretório no mesmo nível.
Ele também pode definir o prompt se você tem os privilégios corretos de uma só vez, por isso, o prompt vai refletir seu diretório padrão, como nos velhos tempos em DOS.