MAGAZINE

ルーターマガジン

クローリング/スクレイピング

google-chromeコマンドをMacで使う方法

2022.03.18
Pocket

アルバイトの佐々です。開発環境と本番環境での環境設定の差によって処理に切り替える、なんていうのはよくあることだと思います。その中の一つとして今回はMacのシェルスクリプト上にてgoogle-chromeコマンドを使えるようにする方法を説明していきます。

環境

ローカル環境
  • macOS Big Sur iOS11.6
  • プロセッサ : 2.3 GHz デュアルコアIntel Core i5
リモート環境
  • Ubuntu 18.04.1 LTS
  • (GNU/Linux 4.15.0-38-generic x86_64)

Chromeの起動方法

Macにはgoogle-chromeコマンドがないため、シェルスクリプト上でchromeを起動させるには、chromeのフルパスを使用して起動していました。

ローカルサーバーがMacで、リモートサーバーはLinuxの場合では、以下のような分岐を使用して、chromeの起動方法を切り替えていました。しかし、Macでgoogle-chromeコマンドが使えればこの分岐が必要なくなり、無駄な処理を省くことができます!

if [ `uname` = "Darwin" ]; then
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-gpu --remote-debugging-port=9222 --user-data-dir=./user --no-sandbox --display=:0.0 &
elif [ `uname` = "Linux" ]; then
google-chrome --disable-gpu --remote-debugging-port=9222 --user-data-dir=./user --no-sandbox --display=:0.0 &
fi

また、chrome_remoteでChromeを自動操縦するには、予めChromeをremote_debbuging_portパラメータつきで起動しておく必要があります。

解決法

結論としてはラッピングされたシェルスクリプトのパスをMACでのchromeのパスに変更して作成することで、macでもremote_debbuging_portパラメータつきで起動できるgoogle-chromeコマンドが使用できるようになります。

$ touch /usr/local/bin/google-chrome
$ chmod a+x /usr/local/bin/google-chrome
$ echo -e '#!/bin/bash\nexec -a "$0" /Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome "$@"' >> /usr/local/bin/google-chrome

解決過程

エイリアスを作る方法(失敗)

始めにエイリアスを作ればMAC上でもgoogle-chromeコマンドを使用できるのではないかということで、以下のようにエイリアスを設定、反映しました。

echo -e alias “google-chrome=‘/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome’” >> ~/.bashrc
source ~/.bashrc

しかし、bash上でgoogle-chromeコマンドを実行してみようとすると、エイリアスが適用されておらず、実行できません。これは、man bashを見るとわかります。

Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt

Bashが非インタラクティブモード(非対話型モード)ではaliasは展開されないと書かれているため、非インタラクティブモードであるシェルスクリプトでは実行できなかったことがわかります。

Linuxではどうしてるか?

Linuxのgoogle-chromeコマンドの中身をみてみると、結局はシェルスクリプトでラップしているだけでした。

$ which google-chrome
/usr/bin/google-chrome

$ cat /usr/bin/google-chrome
#!/bin/bash
#
# Copyright (c) 2011 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Let the wrapped binary know that it has been run through the wrapper.
export CHROME_WRAPPER="`readlink -f "$0"`"

HERE="`dirname "$CHROME_WRAPPER"`"

# We include some xdg utilities next to the binary, and we want to prefer them
# over the system versions when we know the system versions are very old. We
# detect whether the system xdg utilities are sufficiently new to be likely to
# work for us by looking for xdg-settings. If we find it, we leave $PATH alone,
# so that the system xdg utilities (including any distro patches) will be used.
if ! which xdg-settings &> /dev/null; then
# Old xdg utilities. Prepend $HERE to $PATH to use ours instead.
export PATH="$HERE:$PATH"
else
# Use system xdg utilities. But first create mimeapps.list if it doesn't
# exist; some systems have bugs in xdg-mime that make it fail without it.
xdg_app_dir="${XDG_DATA_HOME:-$HOME/.local/share/applications}"
mkdir -p "$xdg_app_dir"
[ -f "$xdg_app_dir/mimeapps.list" ] || touch "$xdg_app_dir/mimeapps.list"
fi

# Always use our versions of ffmpeg libs.
# This also makes RPMs find the compatibly-named library symlinks.
if [[ -n "$LD_LIBRARY_PATH" ]]; then
LD_LIBRARY_PATH="$HERE:$HERE/lib:$LD_LIBRARY_PATH"
else
LD_LIBRARY_PATH="$HERE:$HERE/lib"
fi
export LD_LIBRARY_PATH

export CHROME_VERSION_EXTRA="stable"

# We don't want bug-buddy intercepting our crashes. http://crbug.com/24120
export GNOME_DISABLE_CRASH_DIALOG=SET_BY_GOOGLE_CHROME

# Sanitize std{in,out,err} because they'll be shared with untrusted child
# processes (http://crbug.com/376567).
exec >(exec cat)
exec 2> >(exec cat >&2)

# Note: exec -a below is a bashism.
exec -a "$0" "$HERE/chrome" "$@"

決めてとなるのは最終行のこちらです。

exec -a "$0" "$HERE/chrome" "$@"

$HERE/chromeをシェルスクリプトでラッピングしていることがわかります。

では、どうすればMac向けにできるか?

要は最終行の第二引数にchromeのパスがあれば良いので、Chromeのパスの部分をMACでのChromeのフルパスに変更し、そのシェルスクリプトを/usr/local/bin/google-chromeに作成することでMacでもgoogle-chromeコマンドが使用できます!!

#!/bin/bash
exec -a "$0" /Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome "$@"
chromeのパスが異なる人の場合は、適宜パスの部分を変更してみてください。

参考サイト

  • 【Bash】 スクリプト中のaliasコマンドが実行できない
  • Pocket

    CONTACT

    お問い合わせ・ご依頼はこちらから