Zsh'yi özel bir zshrc ile başlatma


17

Komutu benzer özel bir rc dosyası ile zsh başlatmak istiyorum: bash --rc-file /path/to/file

Bu mümkün değilse, zsh'yi başlatmak, çalıştırmak source /path/to/file, sonra aynı zsh oturumunda kalmak mümkün müdür ?

Not: Komut zsh --rcs /path/to/fileçalışmıyor, en azından benim için değil ...

DÜZENLEME: Bütün olarak aşağıdakileri yapmak istiyorum: sshuzak bir sunucu "example.com", çalıştırmak zsh, sourcebenim yapılandırma bulunan /path/to/file, hepsi 1 komut. Burası, özellikle uzak makinedeki herhangi bir yapılandırma dosyasını yazmak istemediğim için mücadele ettiğim yer.


1
Merhaba Katz, unix'e hoş geldiniz. Sorunuzu, (biraz) okumayı kolaylaştıran bir biçimlendirme eklemek için düzenledim. Nasıl çalıştığını görmek için "düzenle" yi tıklayabilirsiniz. "Teşekkür ederim" ve imzanız gibi bazı ekstra şeyleri de kaldırdım (Stack Exchange ağındaki tüm yayınlar otomatik olarak imzalanır).
drs

1
Teşekkür ederim, şimdi nasıl yazacağımı öğrendim code as such!
hjkatz

Yanıtlar:


18

Man sayfalarından:

STARTUP/SHUTDOWN FILES
       Commands are first read from /etc/zshenv; this cannot be overridden.  Subsequent  be‐
       haviour is modified by the RCS and GLOBAL_RCS options; the former affects all startup
       files, while the second only affects global startup files (those shown here  with  an
       path starting with a /).  If one of the options is unset at any point, any subsequent
       startup file(s) of the corresponding type will not be read.  It is also possible  for
       a  file  in  $ZDOTDIR  to  re-enable  GLOBAL_RCS.  Both RCS and GLOBAL_RCS are set by
       default.

       Commands are then read from $ZDOTDIR/.zshenv.  If the shell is a  login  shell,  com‐
       mands are read from /etc/zprofile and then $ZDOTDIR/.zprofile.  Then, if the shell is
       interactive, commands are read from /etc/zshrc and then $ZDOTDIR/.zshrc.  Finally, if
       the shell is a login shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.

       When a login shell exits, the files $ZDOTDIR/.zlogout and then /etc/zlogout are read.
       This happens with either an explicit exit via the exit  or  logout  commands,  or  an
       implicit exit by reading end-of-file from the terminal.  However, if the shell termi‐
       nates due to exec'ing another process, the logout files are not read.  These are also
       affected  by  the  RCS and GLOBAL_RCS options.  Note also that the RCS option affects
       the saving of history files, i.e. if RCS is unset when the shell  exits,  no  history
       file will be saved.

       If  ZDOTDIR  is unset, HOME is used instead.  Files listed above as being in /etc may
       be in another directory, depending on the installation.

       As /etc/zshenv is run for all instances of zsh, it is important that it  be  kept  as
       small  as  possible.  In particular, it is a good idea to put code that does not need
       to be run for every single shell behind a test of the form `if [[  -o  rcs  ]];  then
       ...' so that it will not be executed when zsh is invoked with the `-f' option.

ZDOTDIRzsh'nin farklı bir nokta dosyası kümesi aramasını sağlamak için ortam değişkenini yeni bir dizine ayarlayabilmeniz gerekir.

Man sayfasının önerdiği RCSve GLOBAL_RCSrc dosyalarının yolu değil, onları kullanmaya çalıştığınız gibi, daha ziyade etkinleştirebileceğiniz veya devre dışı bırakabileceğiniz seçenekler. Örneğin, bayrak seçeneği --rcsetkinleştirerek RCSzsh'nin rc dosyalarından okumasına neden olur. Sen etkinleştirmek veya devre dışı etmek ZSH için aşağıdaki komut satırı bayrakları kullanabilirsiniz RCSya GLOBAL_RCS:

  --globalrcs
  --rcs
  -d    equivalent to --no-globalrcs
  -f    equivalent to --no-rcs

Diğer sorunuza cevap vermek için:

başlatmak, "source / path / to / file" komutunu çalıştırmak ve aynı zsh oturumunda kalmak mümkün müdür?

Evet, yukarıdaki talimatlara göre bu oldukça kolaydır. Sadece koş zsh -d -fve sonra source /path/to/zshrc.


Bu benim sorum başına işe yaradığından, sadece 1 komut çalıştırabileceğimi söyleyemedim. Bu, bunun için ne kullanmak istediğimi karşılamıyor (kişisel yapılandırmalarım ile özel bir ssh). Sorun, çalıştırmadan zsh -d -f; source /path/to/fileçıkana kadar zsh'ın ilk oturumunda ikinci komutu yürütmemesi yatıyor .
hjkatz

Bütünüyle aşağıdakileri yapabilmek istiyorum. sshuzak sunucuya "example.com", çalıştır zsh, sourcebenim yapılandırmam yer /path/to/file, hepsi 1 komut. Burası, özellikle uzak makinedeki herhangi bir yapılandırma dosyasını yazmak istemediğim için mücadele ettiğim yer. Yine de cevap verdiğiniz için teşekkür ederim!
hjkatz

sorun özel bir zshrc kullanmak değil ssh üzerinde bir kabuk kullanmayı bilmiyor gibi görünüyor. Çalıştırırsanız ssh host "zsh -d -f; source /path/to/file", ssh önce zshuzak ana bilgisayarda, ardından source ...zsh kabuğu çıktıktan sonra çalışır. Bunun yerine ssh -t host zsh -d -f, uzak ana bilgisayarda etkileşimli bir kabuğa bırakmak veya etkileşimli bir kabuk istemiyorsanız, yapmak istersiniz ssh host zsh -d -f -c \"source /path/to/file\; other command\; ... \".
jayhendren

Hayır, ssh'ın etkileşimli kabuklarla nasıl çalıştığını anlıyorum. Sorun şu ki, koşmak ssh -t host "zsh -d -f; source /path/to/filebeni interaktif (ve kısır) bir zshkabuğa düşürüyor .
hjkatz

1
Size bunun neden olduğunu ve nasıl düzeltileceğini zaten söyledim. Çalıştırdığınızda ssh -t host "zsh -d -f; source /path/to/file", komut source...zsh kabuğunun içinde çalıştırılmaz. Zsh kabuğu çıktıktan sonra giriş kabuğunuzda çalıştırılır. Bunu test etmek için çalıştırın ssh host "zsh; echo foo". Zsh kabuğundan çıktıktan sonra "foo" çıktısını göreceksiniz .
jayhendren

4

ZDOTDIR ile seçtiğiniz herhangi bir dizinde zshçağrılan bir dosyayı yorumlamayı söyleyebilir .zshrc, seçtiğiniz herhangi bir dosyayı yorumlaması (zorunlu olarak çağrılmaması .zshrc) oldukça zor olur.

Olarak shya da ksh, benzetim zshdeğerlendirir $ENV; böylece üstünüze ekleyebilir emulate zshve şunları /path/to/fileyapabilirsiniz:

ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'

Çok kıvrımlı bir başka yaklaşım şöyle olabilir:

ssh -t host 'PS1='\''${${functions[zsh_directory_name]::="
    set +o promptsubst
    unset -f zsh_directory_name
    unset PS1
    . /path/to/file
 "}+}${(D):-}${PS1=%m%# }'\' exec zsh -o promptsubst -f

Bu biraz açıklamayı hak ediyor.

${foo::=value}aslında ayarlanan değişken bir genişletmedir $foo. $functionsişlev adlarını tanımlarıyla eşleyen özel bir ilişkilendirilebilir dizidir.

promptsubstSeçeneği ile içindeki değişkenler $PS1genişletilir. Böylece, ilk istemde, bu PS1'deki değişkenler genişletilecektir.

zsh_directory_nameFonksiyon genişleyen yardımcı olan özel fonksiyondur ~fooiçin /path/to/somethingters. Örneğin %~komut isteminde kullanılır; böylece, geçerli dizin ise <=> eşlemesini yaparak /opt/myproj/proj/xgörüntüleyebilirsiniz . Bu, parametre genişletme bayrağı tarafından da kullanılır . Eğer biri genişlerse , o fonksiyon çağrılır.~proj:xzsh_directory_nameproj:x/opt/myproj/proj/xD${(D)somevar}zsh_directory_name

Burada, kullandığınız ${(D):-}, ${:-}olduğunu ${no_var:-nothing}için genişlediğinde nothingise $no_varboştur, böylece ${(D):-}arama sırasında hiçbir şey genişler zsh_directory_name. zsh_directory_namedaha önce şu şekilde tanımlanmıştı:

zsh_directory_name() {
  set +o promptsubst
  unset -f zsh_directory_name
  unset PS1; . /path/to/file
}

Olduğunu, (istemi üzerine ilk) ilk PS1 genişlemesi üzerine, ${(D):-}neden olacaktır promptsubstseçeneği (iptal etmek Yokedilecek -o promptsubst,) zsh_directory_name()(biz sadece bir kez çalıştırmak istediğiniz gibi) tanımsız edilecek $PS1Yokedilecek ve /path/to/filekaynaklı edilecek.

${PS1=%m%# }PS1 önceden tanımlanmadığı sürece (örneğin, sonrasına kadar ) öğesini genişletir (ve atar $PS1) ve varsayılan değeri olur .%m%#/path/to/fileunset%m%#PS1


Bu oldukça abartılı görünüyor ve en kısa zamanda denemeliyim. Umarım bu işe yarar!
hjkatz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.