【Bash】 スクリプト中のaliasコマンドが実行できない
環境 archlinux 4.14.4-1
非インタラクティブモードではaliasは展開されない。
非インタラクティブとは
$ bash test.sh
みたいに実行する事。
普通に実行すると以下のようになる
$ cat ~/.bashrc alias ll='ls -la' $ bash test.sh test.sh: line 5: ll: command not found
BASH_ENV
で.bashrcを読み込ませてみる
$ BASH_ENV=~/.bashrc bash test.sh alias ll='ls -la' test.sh: line 5: ll: command not found
aliasは読み込まれるが、実行しようとすると展開されない。
対処法
man bash
にちゃんと書いていた。
Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt
スクリプト中か、実行時オプションで expand_aliases
を指定すればOK。
- オプション実行
$ BASH_ENV=~/.bashrc bash -O expand_aliases test.sh alias ll='ls -la' -rw-r--r-- 1 takafumi takafumi 18 Dec 12 22:06 /home/takafumi/.bashrc
- スクリプト中に
shopt
を追加
$ cat test.sh #!/bin/bash shopt -s expand_aliases alias; ll ~/.bashrc $ BASH_ENV=~/.bashrc bash test.sh alias ll='ls -la' -rw-r--r-- 1 takafumi takafumi 18 Dec 12 22:06 /home/takafumi/.bashrc
ただしデフォフォルト禁止されている事から、プロダクトで使うなどは止めた方がいいだろう。
今回は何故使いたかったかというと、MacにGNU系コマンドをInstallした際にaliasでdate='gdate'
みたいにしていたため、dateのオプションがプロダクト環境とローカルで事なる自体が発生したため。
なので基本はこういう、ローカル側でプロダクト環境との差異を埋めたいときに使うのがいいと思う。
【Linux】 partedでパーティションの拡張
環境 archlinux 4.10.6-1-zen
既に作成済みのパーティション拡張。
ファイルシステムはext4。
archlinux以外でも対外似たような感じだと思う。
1. bootディスクを使ってシステムを起動。
この時はarchlinux-2017.04.01-x86_64.iso
を使用。
2. paretedでパーティション拡張
# parted (pated) p // 現在のサイズを確認 Number Start End Size Type File system Flags 1 100s 20000000s 40000000s primary ext4 (parted) resizepart Number 100% // Numberは上記のもの。
3. ファイルシステムの整合性チェック
# fsck -f /dev/sdaX // パーティション変更したファイルシステム指定
4. ファイルシステムの拡張
# resize2fs /dev/sdaX size // sizeは未指定だと最大になる
5. fstab更新
// 既存の設定でmount # mount /dev/sda3 /mnt # mount /dev/sda1 /mnt/boot # swapon /dev/sda2 // fstab更新 # genfstab -U /mnt >> /mnt/etc/fstab
6. 再起動
ブートディスクをumountして再起動。
【Docker】 docker toolboxでdockerとvagrantを共存
環境 Windows 10 VirtualBox 5.1.12 Vagrant 1.8.7 docker 1.13.1
壮絶に勘違いしていた事。
Windowsで現行Dockerはdocker for windowsしかないと思ってたorz
普通にdocker toolboxとかあるんですね。
docker for widows | docker toolbox | vagrant | |
---|---|---|---|
仮想化方式 | Hyper-V | VirtualBox | VirtualBox/Hyper-V |
VirtualBoxとの共存 | x | o | o / x |
Hyper-Vとの共存 | o | x | o / x |
- Vagrantはprovider選択でHyper-Vを選ぶ事が可。
- ただしWindowsでHyper-VのサービスをONにすると、Hyper-V以外のVirtualBoxは使えなくなる。
なので実際にはどちらか一方を選択という事になる。
docker toolboxは結局VirtualBox上にホストを立てるので、Vagrant上のVirtualBox上でやってもあまり変わらない。 しいて言うなら一枚中間が少なくなって、dockerコマンドがCMD上から使えるが、Linux使いだとCMDでdockerコマンド使えてもそんなにうれしくない気がする。
【Selenium】 【Node.js】独自なwait()条件を作る
環境 Ubuntu 16.04 Selenium Standalone Server 3.0.1
- 普通は
webdriver.until.*
を条件に使う事が多いが、普通に独自の値や条件判定で設定する事もできる。
以下のように、webdriver.Condition
のインスタンスを返すようにすればいい。
ConditionインスタンスはメッセージとManagePromiseを引数にとる。
selenium/promise.js at master · SeleniumHQ/selenium · GitHub
const webdriver = require('selenium-webdriver'); const promise = require('selenium-webdriver/lib/promise').Promise; const driver = new webdriver.Builder() // オプション省略 let cond = function(val) { return new webdriver.Condition( "something message.", /** * @return {!ManagedPromise<T>} */ function(driver){ return promise.resolve(val); } ); } driver.wait(cond(true), 60000);
- ちなみに
document.readyState == 'complete'
を条件にするwait条件をつくりたかったのだが、webdriver.get()
やwebdriver.click()
はデフォルト対応しているらしい。 そしてajaxには無用・・・orz - 更にちなみに、一応以下のような感じ。テスト実施しているブラウザで、
document.*
みたいなのを使いたいときには参考になるかも。
let cond = new webdriver.Condition( "something message.", function(driver){ return driver.executeScript('return document.readyState').then(r => { return r == 'complete'; }) } );
【Selenium】 エラーがでたらまずdriverを更新する
環境 Ubuntu 16.04 Selenium Standalone Server 3.0.1
$ mocha test.js // 略 WebDriverError: unknown error: Runtime.executionContextCreated has invalid 'context': {"auxData":{"frameId":"16896.1","isDefault":true},"id":1,"name":"","origin":"://" } // stack trace
みたいのが延々と出て悩む。
$ node test2.js
みたいのは平気だったので、スクリプトの問題かと思って、また延々と悩む。
結局chromedriverを最新(2.27)に更新したら、サクッと直りました。 まずは悩む前にdriver更新しなさいという教訓。