auto_install.sh
takker.icon用Ubuntuで使うsoftwareを自動でインストールするshell script
環境変数はvariables.shで設定する
入れるもの
neovim
bat
unzip
denoに必要
fish shell
clang
build-essential
XWindow
ffmpeg
pdftotext
deno
Node.js
cargo
exa
実装
https://github.com/takker99/dotfiles/blob/1798728f157a97df18bfa89e04533fc3a62304bd/setup.bash#L19 あたりを参考にする
例外処理を有効にする
code:auto_install.sh
set -eu
catch () {
echo "Some error have occurred. Terminate the installation."
}
trap catch ERR
code:auto_install.sh
if !(type "nvim" > /dev/null 2>&1) \
|| !(type "batcat" > /dev/null 2>&1) \
|| !(type "unzip" > /dev/null 2>&1) \
|| !(type "fish" > /dev/null 2>&1) \
|| !(type "clang" > /dev/null 2>&1) \
|| !(type "xsel" > /dev/null 2>&1); then
echo "Install some apps...";
sudo add-apt-repository ppa:fish-shell/release-3
sudo apt-get update
sudo apt-get install neovim bat unzip fish clang build-essential x11-apps x11-utils x11-xserver-utils dbus-x11 ffmpeg poppler-utils -y
echo "Successfully installed."
fi
if !(type "deno" > /dev/null 2>&1); then
echo "deno is not installed. Install deno..."
curl -fsSL https://deno.land/x/install/install.sh | sh
echo "Successfully installed deno."
fi
当処はnvm経由で入れるつもりだったが、やめた
環境設定をvariables.shに書いてもなぜか読み込まれない
fishとの相性が悪い
nodeは普通にnpm経由で入れることにする
apt経由でnode.jsを入れる
あ、これやってもroot権限が必要なところにglobalのnode_modulesが入ってしまうことには変わりないのか……
Resolving EACCES permissions errors when installing packages globallyのdirectoryを動かす方法をやるしかない
code:auto_install.sh
if !(type "node" > /dev/null 2>&1); then
echo "Node.js is not installed. Install Node.js..."
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install nodejs
root権限の必要ないdirectoryに移動する
code:auto_install.sh
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
echo "Successfully installed node and npm."
fi
yarn V2のinstallだが、いらなそう
Nodeをinstallするときに勝手についてくるっぽい
code:auto_install.sh
if !(type "yarn" > /dev/null 2>&1); then
echo "yarn is not installed. Install yarn..."
npm install -g yarn
# use yarn V2
yarn set version berry
echo "Successfully installed yarn."
fi
if !(type "cargo" > /dev/null 2>&1); then
echo "Rust compile tools is not installed. Install rustup and cargo..."
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
echo "Successfully installed rustup."
fi
if !(type "exa" > /dev/null 2>&1); then
echo "exa is not installed. Install exa..."
cargo install exa
echo "Successfully installed exa."
fi
なぜか$XDG_CONFIG_HOME: command not foundが大量に出てくる
幸いterminalは落ちない
どこで発生しているエラーか調べる
16:26:16 やはりauto_install.sh内で発生している
もう少し詳しく調べる
16:29:48 ふ~む
trapの設定は関係ない
code:log
start auto install
Checking apps not installed yet...
$XDG_CONFIG_HOME: コマンドが見つかりません
$XDG_CONFIG_HOME: コマンドが見つかりません
$XDG_CONFIG_HOME: コマンドが見つかりません
$XDG_CONFIG_HOME: コマンドが見つかりません
$XDG_CONFIG_HOME: コマンドが見つかりません
$XDG_CONFIG_HOME: コマンドが見つかりません
Checking Deno...
$XDG_CONFIG_HOME: コマンドが見つかりません
Checking nvm...
$XDG_CONFIG_HOME: コマンドが見つかりません
Checking node...
$XDG_CONFIG_HOME: コマンドが見つかりません
Checking yarn...
$XDG_CONFIG_HOME: コマンドが見つかりません
Checking cargo...
$XDG_CONFIG_HOME: コマンドが見つかりません
Checking exa...
$XDG_CONFIG_HOME: コマンドが見つかりません
finish auto install
16:31:52 もしかして、set -uでエラーを厳格にしたせいか?
code:sh
$ echo $XDG_CONFIG_HOME
-bash: XDG_CONFIG_HOME: 未割り当ての変数です
プロセスはコード 1 で終了しました
16:33:22 いや、set -eもset -uも関係なかった
削っても同じエラーが出る
16:40:41 コマンドの数から考えて、$XDG_CONFIG_HOME: コマンドが見つかりませんはtype "command" > /dev/null 2>&1から発生している
だがなぜここから発生するのかが全くわからない
export XDG_CONFIG_HOME="$HOME/.config"にしてもだめだった
わかっていること
XXX: コマンドが見つかりませんはXXXというコマンドが存在しないときに発生するエラー
type (shell)はbash環境で動く (確認済み)
auto_install.shはsource (shell)で動かしている
拡張子は関係ない
.shでも.bashでも同じだった
仮説
sourceでtypeは使えない?
16:54:12 ビンゴ!bash auto_install.shなら起動した!
typeはbashでしか使えない
#2021-10-08 14:27:41