Module: Utils::Shell Private

Includes:
Kernel
Included in:
Formula
Defined in:
utils/shell.rb,
utils/shell.rbi

This module is part of a private API. This module may only be used in the Homebrew/brew repository. Third parties should avoid using this module if possible, as it may be removed or changed without warning.

Constant Summary collapse

SHELL_PROFILE_MAP =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

{
  bash: "~/.profile",
  csh:  "~/.cshrc",
  fish: "~/.config/fish/config.fish",
  ksh:  "~/.kshrc",
  mksh: "~/.kshrc",
  rc:   "~/.rcrc",
  sh:   "~/.profile",
  tcsh: "~/.tcshrc",
  zsh:  "~/.zshrc",
}.freeze
UNSAFE_SHELL_CHAR =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

%r{([^A-Za-z0-9_\-.,:/@~+\n])}

Class Method Summary collapse

Methods included from Kernel

#disk_usage_readable, #ensure_executable!, #ensure_formula_installed!, #exec_browser, #exec_editor, #ignore_interrupts, #interactive_shell, #number_readable, #odebug, #odeprecated, #odie, #odisabled, #ofail, #oh1, #oh1_title, #ohai, #ohai_title, #onoe, #opoo, #paths, #pretty_duration, #pretty_installed, #pretty_outdated, #pretty_uninstalled, #quiet_system, #redact_secrets, #redirect_stdout, #require?, #safe_system, #tap_and_name_comparison, #truncate_text_to_approximate_size, #which, #which_all, #which_editor, #with_custom_locale, #with_env, #with_homebrew_path

Class Method Details

.csh_quote(str) ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



112
113
114
115
116
117
118
119
120
121
122
123
# File 'utils/shell.rb', line 112

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) ⇒ String?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Quote values. Quoting keys is overkill.

Parameters:

Returns:



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'utils/shell.rb', line 36

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 :rc
    "#{key}=(#{sh_quote(value)})"
  when :csh, :tcsh
    "setenv #{key} #{csh_quote(value)};"
  end
end

.from_path(path) ⇒ Symbol?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Take a path and heuristically convert it to a shell name, return nil if there's no match.

Parameters:

Returns:



11
12
13
14
15
16
17
# File 'utils/shell.rb', line 11

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 rc sh tcsh zsh].include?(shell_name)
end

.parentSymbol?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



30
31
32
# File 'utils/shell.rb', line 30

def parent
  from_path(`ps -p #{Process.ppid} -o ucomm=`.strip)
end

.preferredSymbol?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



25
26
27
# File 'utils/shell.rb', line 25

def preferred
  from_path(preferred_path)
end

.preferred_path(default: "") ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • default (String) (defaults to: "")

Returns:



20
21
22
# File 'utils/shell.rb', line 20

def preferred_path(default: "")
  ENV.fetch("SHELL", default)
end

.prepend_path_in_profile(path) ⇒ String?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



84
85
86
87
88
89
90
91
92
93
94
95
# File 'utils/shell.rb', line 84

def prepend_path_in_profile(path)
  case preferred
  when :bash, :ksh, :mksh, :sh, :zsh, nil
    "echo 'export PATH=\"#{sh_quote(path)}:$PATH\"' >> #{profile}"
  when :rc
    "echo 'path=(#{sh_quote(path)} $path)' >> #{profile}"
  when :csh, :tcsh
    "echo 'setenv PATH #{csh_quote(path)}:$PATH' >> #{profile}"
  when :fish
    "fish_add_path #{sh_quote(path)}"
  end
end

.profileString

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Return the shell profile file based on user's preferred shell.

Returns:



54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'utils/shell.rb', line 54

def profile
  case preferred
  when :bash
    bash_profile = "#{Dir.home}/.bash_profile"
    return bash_profile if File.exist? bash_profile
  when :rc
    rc_profile = "#{Dir.home}/.rcrc"
    return rc_profile if File.exist? rc_profile
  when :zsh
    return "#{ENV["HOMEBREW_ZDOTDIR"]}/.zshrc" if ENV["HOMEBREW_ZDOTDIR"].present?
  end

  SHELL_PROFILE_MAP.fetch(preferred, "~/.profile")
end

.set_variable_in_profile(variable, value) ⇒ String?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



70
71
72
73
74
75
76
77
78
79
80
81
# File 'utils/shell.rb', line 70

def set_variable_in_profile(variable, value)
  case preferred
  when :bash, :ksh, :sh, :zsh, nil
    "echo 'export #{variable}=#{sh_quote(value)}' >> #{profile}"
  when :rc
    "echo '#{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) ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



126
127
128
129
130
131
132
133
134
135
136
# File 'utils/shell.rb', line 126

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