なにそれ〜ウケる〜
これが動かないパターン
エラーメッセージ
# !/bin/bash
# 直書きなら動く
# ln -s ~/.emacs.d/inits-stok/autoinsert.el ~/.emacs.d/inits/001-autoinsert.el
S='ln -s ~/.emacs.d/inits-stok/autoinsert.el ~/.emacs.d/inits/001-autoinsert.el'
# 実行
# bash script ln: failed to create symbolic link no such file or directory
${S}
$ ./適当なシェルスクリプト.sh
ln: ~/.emacs.d/inits/001-autoinsert.el: No such file or directory
これが動くパターン
# !/bin/bash
S='ln -s ~/.emacs.d/inits-stok/autoinsert.el ~/.emacs.d/inits/001-autoinsert.el'
eval ${S}
たぶんだけど
rbashってあるじゃん。あれってbashの名前が違うだけのエイリアスなんだよね。
セキュリティ的観点から動作を制限してるってヤツ。
んでもって、オペレーションミスなんかで大量にゴミを生み出すような、手のつけられない状況になるようなシェルスクリプトの使い方は抑制されてんじゃねーのかなって、思うのよ。
制限下のbash、restrictedモードのbashって事でrbashをシェルに使っている場合は、evalコマンドとか刺さりそうなコマンドは動かないような気がするのね。
なので、シェルの方も変数展開してのコマンド実行なども、刺さる人には刺さる属性持ってるので制限されちゃってるんじゃないかと。
bashを使う限りじゃ、eval($ほげー)を使えばいいじゃんって話だしね。
ちなみに
あっれ?動かないじゃん。
あっぁっぁ、そう言えば、昔も同じことで悩んだんだった・・・ orz={( ´,_ゝ`)プッ}
じぶんへのいましめのため Qiita に書いてます。
ちなみに、今、作ってたスクリプトはこれ
# !/bin/bash
# ファイル名を配列に取り込む
# コメント記号の後は必ず空白が必要
TGTFNS=$(cat << 'FNEOS'
autoinsert
face-font
all-the-icon
calendar
scratch
swiper
dired
tabbar
tree_speed_ber
ido
find-grep
company
ctags
ediff
electrict-mode
org-mode
howm
markdown
flycheck
perl
moccur
oddmuse
vim
allwantfont
plantuml
FNEOS
)
echo $TGTFNS
# 配列要素の数だけループ処理を行う
countLineSkiper=0
countIndex=0
for x in $TGTFNS
do
# echo "a:[$x]"
# 次行スキップ処理
if (($countLineSkiper > 0)) ; then
let --countLineSkiper
# echo "skipper ${countLineSkiper}:[${x}]"
continue
fi
# 入力要素の検査:コメント行は以降の処理をスキップする
if [[ "${x}" =~ ^#.* ]]; then
# echo "対象はコメント行です。スキップします"
let ++countLineSkiper
continue
fi
let ++countIndex
S=$(printf "ln -s ~/.emacs.d/inits-stok/${x}.el ~/.emacs.d/inits/%03d-${x}.el" "${countIndex}")
#echo "![${S}]"
echo "${S}"
${S}
#eval ${S}
done
echo "aaa"
## EOF _makelink
Emacs の inits ディレクトリでファイル名のプレフィックスに数桁数値が並んでいると目が滑って辛い。
よーし、リハビリを兼ねて久しぶりにシェルスクリプト書いちゃうぞ〜!
そういう現実逃避で作ってる途中です。
ほぼほぼ出来てるので、完成まで持ってかないでこのままぶん投げちゃうかもしれないです。