একটি কাস্টম zshrc দিয়ে zsh শুরু করুন


17

কমান্ডের অনুরূপ কাস্টম আরসি ফাইল দিয়ে zsh শুরু করতে সক্ষম হতে চাই: bash --rc-file /path/to/file

যদি এটি সম্ভব না হয়, তবে কি zsh শুরু করা, চালানো source /path/to/file, তারপর একই zsh অধিবেশনে থাকা সম্ভব?

দ্রষ্টব্য: কমান্ডটি zsh --rcs /path/to/fileকাজ করে না, কমপক্ষে আমার পক্ষে নয় ...

সম্পাদনা: সম্পূর্ণরূপে আমি নিম্নলিখিতগুলি করতে সক্ষম হতে ইচ্ছুক: sshদূরবর্তী সার্ভারে "উদাহরণ.com", রান করুন zsh, sourceআমার কনফিগারেশনটি /path/to/file1 কমান্ডের মধ্যে অবস্থিত । এখানেই আমি লড়াই করেছি, বিশেষত কারণ আমি দূরবর্তী মেশিনে কোনও কনফিগারেশন ফাইল না লিখে লিখছি।


1
হাই কাটজ, ইউনিক্স.এসই তে স্বাগতম আমি আপনার প্রশ্নটি এমন কিছু ফর্ম্যাটিং যুক্ত করতে সম্পাদনা করেছি যা এটি পড়ার (সামান্য) সহজ করে তোলে। এটি কীভাবে কাজ করে তা দেখতে আপনি "সম্পাদনা" এ ক্লিক করতে পারেন। আমি "অতিরিক্ত ধন্যবাদ" এবং আপনার স্বাক্ষর (স্ট্যাক এক্সচেঞ্জ নেটওয়ার্কের সমস্ত পোস্ট স্বয়ংক্রিয়ভাবে স্বাক্ষরিত হয়েছে) এর মতো কিছু অতিরিক্ত জিনিসও সরিয়েছি।
drs

1
আপনাকে ধন্যবাদ, আমি এখন টাইপ করতে শিখেছি code as such!
hjkatz

উত্তর:


18

ম্যান পেজগুলি থেকে:

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.

সুতরাং আপনার ZDOTDIRডটফাইলের আলাদা সেট সন্ধান করতে zsh পেতে একটি নতুন ডিরেক্টরিতে পরিবেশের পরিবর্তনশীল সেট করতে সক্ষম হওয়া উচিত ।

ম্যান পৃষ্ঠার পরামর্শ অনুসারে, RCSএবং GLOBAL_RCSআরসি ফাইলগুলির পাথ নয় যেমন আপনি সেগুলি ব্যবহার করার চেষ্টা করছেন, বরং বিকল্পগুলি আপনি সক্ষম বা অক্ষম করতে পারবেন। সুতরাং, উদাহরণস্বরূপ, পতাকাটি আরসি ফাইলগুলি থেকে zsh পড়ার ফলে বিকল্পটি --rcsসক্ষম করবে RCS। আপনি সক্ষম বা অক্ষম করতে zsh নিম্নলিখিত কম্যান্ড-লাইন ফ্ল্যাগ ব্যবহার করতে পারেন RCSবা GLOBAL_RCS:

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

আপনার অন্যান্য প্রশ্নের উত্তর দিতে:

zsh শুরু করা, "উত্স / পথ / থেকে / ফাইল" চালানো কি একই zsh অধিবেশনে থাকা সম্ভব?

হ্যাঁ, উপরের দিকনির্দেশ অনুসারে এটি বেশ সহজ। শুধু দৌড়াতে zsh -d -fএবং তারপর source /path/to/zshrc


এটি আমার প্রশ্ন অনুযায়ী কাজ করে, আমি উল্লেখ করতে ব্যর্থ হয়েছি যে আমি কেবল 1 টি কমান্ড চালাতে পারি। এটির জন্য আমি এটি কী ব্যবহার করতে চাই তা সন্তুষ্ট হয় না (আমার ব্যক্তিগত কনফিগারেশনের সাথে একটি কাস্টম এসএসএস)। সমস্যাটির মধ্যে রয়েছে যে zsh -d -f; source /path/to/fileচলমানটি zsh এর প্রথম সেশনে প্রস্থান না হওয়া পর্যন্ত দ্বিতীয় কমান্ড চালায় না।
hjkatz

সম্পূর্ণরূপে আমি নিম্নলিখিতটি করতে সক্ষম হতে ইচ্ছুক। sshএকটি দূরবর্তী সার্ভারে "example.com", রান করুন zsh, sourceআমার কনফিগারেশনটি অবস্থিত /path/to/file, সমস্ত 1 কমান্ডে। এখানেই আমি লড়াই করেছি, বিশেষত কারণ আমি দূরবর্তী মেশিনে কোনও কনফিগারেশন ফাইল না লিখে লিখছি। যদিও উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ!
hjkatz

দেখে মনে হচ্ছে আপনার সমস্যাটি কাস্টম zshrc ব্যবহার করার ক্ষেত্রে নয় তবে কীভাবে ssh- র মাধ্যমে শেল ব্যবহার করবেন তা জানেন না। আপনি যদি চালনা করেন ssh host "zsh -d -f; source /path/to/file"তবে ssh প্রথমে zshদূরবর্তী হোস্টে চলবে , তারপরে source ...zsh শেলটি প্রস্থান করার পরে। পরিবর্তে আপনি যা করতে চান তা হ'ল ssh -t host zsh -d -fদূরবর্তী হোস্টের একটি ইন্টারেক্টিভ শেলটিতে ফেলে দেওয়া, বা যদি আপনি কোনও ইন্টারেক্টিভ শেলটি না চান, তবে করুন ssh host zsh -d -f -c \"source /path/to/file\; other command\; ... \"
জয়হেনডেন

না আমি বুঝতে পারি কীভাবে ইন্টারেক্টিভ শেলগুলির সাথে ssh কাজ করে। সমস্যাটি হ'ল ssh -t host "zsh -d -f; source /path/to/fileদৌড়াদৌড়ি আমাকে একটি ইন্টারেক্টিভ (এবং বন্ধ্যা) zshশেলের মধ্যে ফেলে দেয়।
hjkatz

1
আমি ইতোমধ্যে আপনাকে বলেছি যে এটি কেন এবং কীভাবে এটি ঠিক করবেন। আপনি যখন চালান ssh -t host "zsh -d -f; source /path/to/file", কমান্ডটি source...zsh শেলের ভিতরে চালিত হয় না। Zsh শেলটি প্রস্থান করার পরে এটি আপনার লগইন শেলের মধ্যে চলে। এটি পরীক্ষা করার জন্য, চালান ssh host "zsh; echo foo"। Zsh শেল থেকে বেরিয়ে যাওয়ার পরে আপনি আউটপুট "foo" দেখতে পাবেন ।
জয়েন্দ্রেন

4

জেডডটডিআইআরের সাথে থাকাকালীন, আপনি আপনার পছন্দের যে কোনও ডিরেক্টরিতে zshডাকা একটি ফাইলের ব্যাখ্যা করতে বলতে পারেন .zshrc, এটি আপনার নির্বাচনের যে কোনও ফাইলের ব্যাখ্যা দেয় (অগত্যা বলা হয় না .zshrc) বেশ কঠিন প্রমাণিত হয়।

ইন shবা kshঅনুকরণ, zshমূল্যায়ন $ENV; যাতে আপনি emulate zshআপনার শীর্ষে যোগ করতে /path/to/fileএবং করতে পারেন:

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

আর একটি খুব সংশ্লেষিত পদ্ধতির হতে পারে:

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

এটি একটি ব্যাখ্যা একটি বিট প্রাপ্য।

${foo::=value}একটি পরিবর্তনশীল সম্প্রসারণ যে আসলে সেট $foo$functionsএকটি বিশেষ সাহসী অ্যারে যা তাদের সংজ্ঞাগুলিতে ফাংশনের নাম ম্যাপ করে।

সঙ্গে promptsubstবিকল্প, ভেরিয়েবলের মধ্যে $PS1প্রসারিত করছে। সুতরাং, প্রথম প্রম্পটের পরে, PS1 এর ভেরিয়েবলগুলি প্রসারিত হবে।

zsh_directory_nameফাংশন একটি বিশেষ ফাংশন যা বিস্তৃত সাহায্য করে ~fooথেকে /path/to/somethingএবং বিপরীত। %~এটি প্রম্পটে উদাহরণস্বরূপ ব্যবহার করা হয় যাতে বর্তমান ডিরেক্টরিটি যদি থাকে তবে /opt/myproj/proj/xআপনি ম্যাপিংয়ের ~proj:xমাধ্যমে এটি প্রদর্শন করতে পারেন <=> । এটি প্যারামিটার সম্প্রসারণ পতাকাও ব্যবহার করে । সুতরাং যদি একটি প্রসারিত হয় , যে ফাংশন বলা হবে।zsh_directory_nameproj:x/opt/myproj/proj/xD${(D)somevar}zsh_directory_name

এখানে, আমরা ব্যবহার করছি ${(D):-}, ${:-}হলো, ${no_var:-nothing}বিস্তৃতি করার nothingযদি $no_varখালি থাকে, তাই ${(D):-}যখন কলিং কিছুই বিস্তৃতি zsh_directory_namezsh_directory_nameপূর্বে হিসাবে সংজ্ঞায়িত করা হয়েছে:

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

অর্থাৎ প্রথম PS1 সম্প্রসারণ (প্রথম প্রম্পট উপর) পরে, ${(D):-}কারণ হবে promptsubstবিকল্প সেট না করা (বাতিল করতে -o promptsubst), zsh_directory_name()undefined করা (যেমন আমরা এটা শুধুমাত্র একবার চালাতে চান) $PS1সেট না হবে, এবং /path/to/filesourced করা হবে।

${PS1=%m%# }পিএস 1 ইতিমধ্যে সংজ্ঞায়িত না $PS1হওয়া %m%#পর্যন্ত (এবং অ্যাসাইন করে ) প্রসারিত হয় ( উদাহরণস্বরূপ /path/to/fileপরে এর পরে unset), এবং %m%#এর ডিফল্ট মান হিসাবে ঘটে PS1


এটি বেশ অমিতব্যয়ী দেখায় এবং যত তাড়াতাড়ি সম্ভব এটি চেষ্টা করব। আমি আশাবাদী এই কাজ!
hjkatz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.