Module: Utils::Shell
Constant Summary collapse
- SHELL_PROFILE_MAP =
{ bash: "~/.profile", csh: "~/.cshrc", fish: "~/.config/fish/config.fish", ksh: "~/.kshrc", mksh: "~/.kshrc", sh: "~/.profile", tcsh: "~/.tcshrc", zsh: "~/.zshrc", }.freeze
- UNSAFE_SHELL_CHAR =
%r{([^A-Za-z0-9_\-.,:/@~\n])}.freeze
Class Method Summary collapse
- .csh_quote(str) ⇒ Object
- .export_value(key, value, shell = preferred) ⇒ Object
- .from_path(path) ⇒ Object
- .parent ⇒ Object
- .preferred ⇒ Object
- .prepend_path_in_profile(path) ⇒ Object
- .profile ⇒ Object
- .set_variable_in_profile(variable, value) ⇒ Object
- .sh_quote(str) ⇒ Object
Class Method Details
.csh_quote(str) ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'Library/Homebrew/utils/shell.rb', line 99 def csh_quote(str) # ruby's implementation of shell_escape str = str.to_s return "''" if str.empty? str = str.dup # anything that isn't a known safe character is padded str.gsub!(UNSAFE_SHELL_CHAR, "\\\\" + "\\1") # rubocop:disable Style/StringConcatenation # newlines have to be specially quoted in csh str.gsub!(/\n/, "'\\\n'") str end |
.export_value(key, value, shell = preferred) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'Library/Homebrew/utils/shell.rb', line 33 def export_value(key, value, shell = preferred) case shell when :bash, :ksh, :mksh, :sh, :zsh "export #{key}=\"#{sh_quote(value)}\"" when :fish # fish quoting is mostly Bourne compatible except that # a single quote can be included in a single-quoted string via \' # and a literal \ can be included via \\ "set -gx #{key} \"#{sh_quote(value)}\"" when :csh, :tcsh "setenv #{key} #{csh_quote(value)};" end end |
.from_path(path) ⇒ Object
13 14 15 16 17 18 19 |
# File 'Library/Homebrew/utils/shell.rb', line 13 def from_path(path) # we only care about the basename shell_name = File.basename(path) # handle possible version suffix like `zsh-5.2` shell_name.sub!(/-.*\z/m, "") shell_name.to_sym if %w[bash csh fish ksh mksh sh tcsh zsh].include?(shell_name) end |
.parent ⇒ Object
27 28 29 |
# File 'Library/Homebrew/utils/shell.rb', line 27 def parent from_path(`ps -p #{Process.ppid} -o ucomm=`.strip) end |
.preferred ⇒ Object
22 23 24 |
# File 'Library/Homebrew/utils/shell.rb', line 22 def preferred from_path(ENV.fetch("SHELL", "")) end |
.prepend_path_in_profile(path) ⇒ Object
74 75 76 77 78 79 80 81 82 83 |
# File 'Library/Homebrew/utils/shell.rb', line 74 def prepend_path_in_profile(path) case preferred when :bash, :ksh, :mksh, :sh, :zsh, nil "echo 'export PATH=\"#{sh_quote(path)}:$PATH\"' >> #{profile}" when :csh, :tcsh "echo 'setenv PATH #{csh_quote(path)}:$PATH' >> #{profile}" when :fish "echo 'set -g fish_user_paths \"#{sh_quote(path)}\" $fish_user_paths' >> #{profile}" end end |
.profile ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 |
# File 'Library/Homebrew/utils/shell.rb', line 49 def profile case preferred when :bash bash_profile = "#{ENV["HOME"]}/.bash_profile" return bash_profile if File.exist? bash_profile when :zsh return "#{ENV["ZDOTDIR"]}/.zshrc" if ENV["ZDOTDIR"].present? end SHELL_PROFILE_MAP.fetch(preferred, "~/.profile") end |
.set_variable_in_profile(variable, value) ⇒ Object
62 63 64 65 66 67 68 69 70 71 |
# File 'Library/Homebrew/utils/shell.rb', line 62 def set_variable_in_profile(variable, value) case preferred when :bash, :ksh, :sh, :zsh, nil "echo 'export #{variable}=#{sh_quote(value)}' >> #{profile}" when :csh, :tcsh "echo 'setenv #{variable} #{csh_quote(value)}' >> #{profile}" when :fish "echo 'set -gx #{variable} #{sh_quote(value)}' >> #{profile}" end end |
.sh_quote(str) ⇒ Object
113 114 115 116 117 118 119 120 121 122 123 |
# File 'Library/Homebrew/utils/shell.rb', line 113 def sh_quote(str) # ruby's implementation of shell_escape str = str.to_s return "''" if str.empty? str = str.dup # anything that isn't a known safe character is padded str.gsub!(UNSAFE_SHELL_CHAR, "\\\\" + "\\1") # rubocop:disable Style/StringConcatenation str.gsub!(/\n/, "'\n'") str end |