0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

bashスクリプトでlnコマンド出来ない?え?なんで!?あっれ〜知らなかったの〜ウケる〜

Posted at

なにそれ〜ウケる〜

これが動かないパターン

エラーメッセージ

適当なシェルスクリプト.sh
# !/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

これが動くパターン

適当なシェルスクリプトaaa.sh
# !/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 に書いてます。

ちなみに、今、作ってたスクリプトはこれ

~/.emacs.d/_inits-stok_2_makelink.sh
# !/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 ディレクトリでファイル名のプレフィックスに数桁数値が並んでいると目が滑って辛い。
よーし、リハビリを兼ねて久しぶりにシェルスクリプト書いちゃうぞ〜!
そういう現実逃避で作ってる途中です。
ほぼほぼ出来てるので、完成まで持ってかないでこのままぶん投げちゃうかもしれないです。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?