jsbundling-rails icon indicating copy to clipboard operation
jsbundling-rails copied to clipboard

Replace `command` with `which` in tool_exists

Open cocco111 opened this issue 11 months ago • 7 comments

command is a built-in shell command in linux (at least in debian , ubuntu and similars) If executed in ruby system it return nil (inspecting: 127 command not found) This not happens with which, that is a system command.

I 've done a PR for fast, but if you prefer I can open a simple issue. 🙂 TY

cocco111 avatar Mar 22 '24 18:03 cocco111

It's fine for it to return nil when the command is not found. It's falsy.

dhh avatar Jul 29 '24 18:07 dhh

Sorry but It seems not ok to me If 'command' is not found returns falsy, but in this situation routine is unable to find 'tool'

cocco111 avatar Jul 29 '24 19:07 cocco111

I don't understand the concern you're raising:

irb(main):001> system "command -v yarn > /dev/null"
=> true
irb(main):002> system "command -v yorn > /dev/null"
=> false

dhh avatar Jul 29 '24 22:07 dhh

'command' is a shell (sh) command If you execute irb not in a shell but in windows CMD or kind of different terminals, the result will be always falsy, for error 'command not found' referred to 'command' itself

Instead 'which' is an external command, often installed at system level (is an executable in PATH) in both Linux, Windows etc

cocco111 avatar Jul 30 '24 12:07 cocco111

Ah, I see. So you're hitting this problem running it in a Windows shell? Does the rest of everything work otherwise? We typically don't spend much/any time on compatibility with Windows shell, since WSL offers a much easier road to compatibility. Or is there another shell where this is manifesting itself?

dhh avatar Jul 30 '24 14:07 dhh

Also in linux See these screens WSL2 - Ubuntu wsl Real linux - Debian linux Both have same problem My opinion: IRB does not spawn on the sh shell who launched it (it's a different process? standalone executable? don't know),

cocco111 avatar Aug 02 '24 17:08 cocco111

> /dev/null part is kind of required for system to run it as a shell command:

>> system "command -v yarn > /dev/null"
=> true

as opposed to trying to find a file to execute:

>> system "command -v yarn", exception: true
(irb):1:in `system': No such file or directory - command (Errno::ENOENT)
  • command_line if it is a string, and if it begins with a shell reserved word or special built-in, or if it contains one or more meta characters.
  • exe_path otherwise.

https://rubyapi.org/3.3/o/kernel#method-i-system


I think command -v should stay:

https://unix.stackexchange.com/questions/85249/why-not-use-which-what-to-use-then

4lllex avatar Sep 17 '24 05:09 4lllex