takafumi blog

日々の勉強メモ

【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
$ 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

ただしデフォフォルト禁止されている事から、プロダクトで使うなどは止めた方がいいだろう。

今回は何故使いたかったかというと、MacGNU系コマンドを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を選ぶ事が可。
  • ただしWindowsHyper-VのサービスをONにすると、Hyper-V以外のVirtualBoxは使えなくなる。
    なので実際にはどちらか一方を選択という事になる。

docker toolboxは結局VirtualBox上にホストを立てるので、Vagrant上のVirtualBox上でやってもあまり変わらない。 しいて言うなら一枚中間が少なくなって、dockerコマンドがCMD上から使えるが、Linux使いだとCMDでdockerコマンド使えてもそんなにうれしくない気がする。

f:id:takafumi-s:20170218135432p:plain

【Selenium】 【Node.js】独自なwait()条件を作る

環境   Ubuntu 16.04 Selenium Standalone Server 3.0.1

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更新しなさいという教訓。

【Ubuntu】 サーバーイメージにX Window Systemインストール

環境   Ubuntu 16.04

  • サーバーイメージだとxorgがないのでインストール
$ sudo apt-get -y install xorg xserver-xorg
  • 起動
$ startx
  • xeyesとかで確認してみる。

  • 終了

$ exit