Executing Different Commands in Different Directories
I often encounter situations like this:
- GitBook has a “server” command, for example,
gitbook serve
. - Jekyll has a “server” command, for example,
jekyll serve
. - Rails has a “server” command, for example,
rails server
.
The commands above are not exactly the same, and every time before I type the “server” command, I have to think for a while about which command to use. It’s okay if there are only a few, but once there are many similar commands, it’s easy to get confused and hard to remember. It would be great if there was a server
command that could automatically choose the appropriate command to execute.
Action speaks louder than words. Below is a solution I wrote in Ruby. If you don’t like using Ruby, you can rewrite it in another language; the idea is similar.
#!/usr/bin/env ruby
dir_commands = {
"/Users/mwum/Gitbook/Ruby" => "gitbook serve --port 4006",
"/Users/mwum/dx" => "jekyll serve -w",
"/Users/mwum/Code/Rails/chat-system" => "bundle exec rails server"
}
dir_commands.each do |dir, command|
if Dir.pwd == dir
exec command
end
end
puts "#{File.basename(__FILE__)}: no command defined for current directory: #{Dir.pwd}"
Name the file above as “server” and place it in the bin directory. Make it executable with chmod +x ./server
, and you can use it happily.
One thing to note: It is more appropriate to use exec
to execute commands, not system
or others. If you use system
, the Ruby process does not exit but waits for system
to return. Since the “server” command does not return immediately, using system
is not appropriate; the Ruby process will wait indefinitely. However, exec
completely replaces the process, so this problem does not occur.
The program above is still not smart enough. If I want all subdirectories under a certain directory to execute the same command, it’s obviously not suitable to set each subdirectory individually. Therefore, continue to add regular expression matching functionality to the program above.
#!/usr/bin/env ruby
dir_commands = {
%r{/Users/mwum/Gitbook/*} => "gitbook serve --port 4006",
"/Users/mwum/dx" => "jekyll serve -w",
%r{/Users/mwum/Code/Rails/*} => "bundle exec rails server"
}
dir_commands.each do |dir, command|
case dir
when String
if Dir.pwd == dir
puts "Execute command: #{command}"
exec command
end
when Regexp
if Dir.pwd =~ dir
puts "Execute command: #{command}"
exec command
end
else
puts "This dir class is not supported: #{dir.class}"
exit
end
end
puts "#{File.basename(__FILE__)}: no command defined for current directory: #{Dir.pwd}"
Next: Palworld Mods Installation Explained: A Step-by-Step Guide with Vortex