Following up from changing CWD with helm projectile, here's a way to search your bash history with helm:
(defun ar/helm-helm (title candidates on-select-function)
"Helm with TITLE CANDIDATES and ON-SELECT-FUNCTION."
(helm :sources `((name . ,title)
(candidates . ,candidates)
(action . ,on-select-function))
:buffer "*helm-exec*"
:candidate-number-limit 10000))
(defun ar/shell-send-command (command)
"Send COMMAND to shell mode."
(assert (string-equal mode-name "Shell") nil "Not in Shell mode")
(goto-char (point-max))
(comint-kill-input)
(insert command)
(comint-send-input))
(defun ar/helm-shell-search-history ()
"Narrow down bash history with helm."
(interactive)
(assert (string-equal mode-name "Shell") nil "Not in Shell mode")
(ar/helm-helm "bash history"
(with-temp-buffer
(insert-file-contents "~/.bash_history")
(reverse
(delete-dups
(split-string (buffer-string) "\n"))))
#'ar/shell-send-command))
Bonus: Replace existing M-r binding to use ar/helm-shell-search-history.
(bind-key "M-r" #'ar/helm-shell-search-history shell-mode-map)