シェルスクリプト総合 その32

■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。

シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
2020/03/08(日) 03:12:50.23ID:P20sq25k
>>791
そう、思い出した。ファイルのパーミッションを自分から読み書きできないように変更して
本当に読み書きできないか、-wや-rでチェックするコードを書いたら、rootの場合は
それが上手くいかなかった。だからrootではそのチェックをしないようにした。
2020/03/08(日) 05:16:19.40ID:Xv2JcybJ
rootの場合でも対象に書き込めるんだから真っ当な動作だわな
2020/03/08(日) 12:36:43.71ID:uLLaNXsz
rootが「一見書き込めない」ファイルは存在しうるけど
「書き込む許可をどうしても得られない」ファイルはシステムの不具合でもない限り存在しないからね。
じゃなきゃそのファイルを誰が処理するのかって話になる。

UID 0は自分が持ち上げられない岩は作れないのだ。
2020/03/08(日) 19:11:47.52ID:RzwfZ5D7
Read onlyでマウントしたのはボリュームはrootでも書き込めないよね。そもそも書き込めないメディアも
あくまでも-wは書き込めるかの判定だから使う側が勘違いしてるだけで判定としてはrootでも全く正常な動き
2020/03/08(日) 19:58:45.91ID:T8rZAzyK
cd -Lの-Lってデフォルト?
2020/03/08(日) 20:25:40.77ID:kizyo8RY
デファクトでデフォルト
798デフォルトの名無しさん
垢版 |
2020/03/08(日) 22:45:41.68ID:rfEr1WGY
>>795
スクリプトを一般ユーザーで実行した際に書き込み権限があるかを判別するって認識でいいんですかね?
rootだと基本全部書き込めるから、一般ユーザーくらいでしか機能しない処理のような気がします。
2020/03/08(日) 23:08:52.65ID:5CM70Uar
単に現在(のユーザで)書き込めるかどうか判別してるにすぎないざね。権限とかは置いておいて。書き込める=書き込める権限と言うのならそうかもしれんが

ちなみに、macOSだとロックというのがあり、ロックするとrootでも書き込めないよう
権限とかではなくて単に書き込めるかどうかだな。Read onlyでrootで書き込めないのもそうだし
権限を調べたいならrootではなくてだろうね。もしくは詳しく権限を調べるとか
2020/03/09(月) 01:15:25.69ID:EmgiRGOf
>ちなみに、macOSだと〜
macOSというかBSDだな。FreeBSD/OpenBSDにもあった、そして挙動が同じ
2020/03/09(月) 08:15:32.71ID:nSyyVcXg
>>798
> 一般ユーザーくらいでしか機能しない処理のような気がします。

逆じゃね?w
rootくらいでしか問題にならないでしょ

rootでなんか普通使わねーw
2020/03/09(月) 15:04:18.04ID:rWRx//dL
PWDってさ、スクリプト実行前に設定されるって思う?
2020/03/09(月) 15:50:41.07ID:sbrbbxpE
されてないシェルなんてあったらそのシェルのバグだろう
2020/03/09(月) 16:01:54.84ID:sbrbbxpE
いや、どいつもこいつも設定しないのか。意外だな
PWD
This variable shall represent an absolute pathname of the current working directory. It shall not contain any filename components of dot or dot-dot. The value is set by the cd utility.
> The value is set by the cd utility.
まんまなのか(?)
2020/03/09(月) 16:26:06.84ID:sbrbbxpE
いや、スクリプトファイルの実行時にならされる、-c のコマンド羅列文字列の実行時にはされないかな?
2020/03/09(月) 18:07:49.62ID:bHKN7jy6
どのシェルも設定されるなーって思ってたらkshはされんかった
export $PWD=aaaってやって
ksh -c 'echo $PWD'したらaaaってでた
2020/03/09(月) 18:10:56.70ID:bHKN7jy6
-cだけじゃなくてksh a.shってやってもaaaってでたw
最初、echo $PWDの前に確認のためにpwdコマンドやっていて気づかんかった
kshだとpwdやったらPWDも設定されたw
2020/03/09(月) 18:14:17.37ID:bHKN7jy6
おぉ? kshだとcd .してもPWDは設定されんかったぞw
流石に別ディレクトリに移動したら設定されるが
2020/03/09(月) 18:33:20.75ID:6JwbfpR0
しまった。>>804,805は -c で " で括ってた。そりゃあ...すまん

kshも設定されない?(??)
export HOGE=hoge
export PWD=hage
ksh -c 'echo $PWD $HOGE'
ってやったら、(pwdの) hoge かな。バージョン違いかな? うちのは 93u+
2020/03/09(月) 18:39:14.18ID:bHKN7jy6
面白いなw
export PWD=aaaってやって以下のスクリプトを実行したら

echo $PWD # aaa
echo $(echo $PWD) # /home/ore
echo $PWD # /home/ore
ってなった。

どこで設定してるんだよwww
kshは93u+
2020/03/09(月) 18:40:22.34ID:6JwbfpR0
>>808
どういうテストなのかわからんけど、93u+ ではこんなん
$ cd /home
$ echo $PWD
/home
$ PWD=hoge
$ echo $PWD
hoge
$ pwd
/home
$ echo $PWD
hoge
$ cd .
$ echo $PWD
/home
2020/03/09(月) 18:40:35.23ID:bHKN7jy6
echo実行後にせってされてるのでは?と思う人のために

echo $PWD # aaa
echo $PWD # aaa
echo $(echo $PWD) # /home/ore
echo $PWD # /home/ore
2020/03/09(月) 18:41:47.16ID:6JwbfpR0
>>810
同じか。ナゾだなw
2020/03/09(月) 18:42:40.76ID:bHKN7jy6
>>811
あ、kshに入ってから実行してるわけじゃないよ
bashからksh -c とか ksh a.sh とかしてる

ksh上でやってるならプロンプト表示する処理の
どこかで設定されてるのでは?
2020/03/09(月) 18:45:40.99ID:bHKN7jy6
echo $PWD # aaa
:
echo $PWD # aaa

-----

echo $PWD # aaa
$()
echo $PWD # aaa

-----

echo $PWD # aaa
$(:)
echo $PWD # /home/ore

サブシェルに入ってから?なんか実行すると設定されるっぽいw
2020/03/09(月) 18:46:18.77ID:6JwbfpR0
$ ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD'
でも、
hoge
/home
かな
2020/03/09(月) 18:48:20.68ID:bHKN7jy6
つまりkshで安全に$PWDを使うためには
最初の方で$(:)を実行しておけってことだなw
これが最速の方法か知らんけど、pwd > /dev/null よりかは速そう。いやどっちだろ?
2020/03/09(月) 18:50:28.04ID:bHKN7jy6
bashでログインして、cd /homeして

ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD' を実行すると
hoge
/home
ってでる

export PWD=hoge
ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD' を実行すると
hoge
hoge
ってでる
2020/03/09(月) 18:51:54.13ID:bHKN7jy6
ははは、ワロスワロス。どうなってるのか考えたら、頭がこんがらがってきたw
2020/03/09(月) 18:55:32.91ID:6JwbfpR0
なるほど
PWDがexportされていたかに影響するのか、イミフだな
exportされてるされてないで、pwdでのPWDも動作違う(?)
2020/03/09(月) 19:04:32.47ID:bHKN7jy6
PWDはデフォルトでexportされてるはずだから

cd /home
PWD=hoge
ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD'

これも
hoge
hoge
2020/03/09(月) 19:05:54.23ID:bHKN7jy6
ムリw バグっぽいけど、どういうバグなのか頭が働かないw
2020/03/09(月) 19:11:00.02ID:bHKN7jy6
スクリプトの中から
さらにksh -c 'echo $PWD'してもPWDはaaaのままだたけど
(echo $PWD)するだけで/homeになるな。
つまりサブシェルを使うと、サブシェルの外のPWDの状態が変化する
2020/03/09(月) 19:20:17.23ID:6JwbfpR0
うむ、PWDをイジるとね

>>809のも
export HOGE=hoge
export PWD=hage
ksh -c 'echo $PWD $HOGE'

ログインして(シェルはbash)すぐ実行だと、
/home/ore hage
ログインして(bash)、cd /home した後だと、
hage hoge
だな。まずイミフ。PWDなんてイジらない(そもそもkshを好んで使わないwそういういOSがあるらしいが知らんw)から忘れようw
2020/03/10(火) 00:15:26.42ID:oWfapBN9
files="/Users/aaa/Documents/*"
for filepath in $files;
do
case $filepath in *.txt)
echo $filepath
esac
done

このcaseをifに置き換えた場合がうまくできません
ご指導よろしくお願いします
2020/03/10(火) 00:18:49.52ID:Cf5scsdy
forからやり直して下さい
2020/03/10(火) 00:20:14.51ID:QrvPekFm
caseでいいやん?なんでifに置き換えるのさ。意味ない。
2020/03/10(火) 06:34:25.94ID:fD+LS7Hr
単に拡張子を判断したいってだけじゃね。それも txt 一つだけとか。だとしたら、
if [ "${filepath##*.}" = "txt" ]; then
echo "$filepath"
fi
とかにしたくなるのもわからないでもない
2020/03/10(火) 08:08:24.53ID:oWfapBN9
>>827
勉強中でどうすればいいかわからなくて色々試してる最中です
if [[ $filepath = *.txt ]]; then
[[]]としたら出来ました
files="/Users/aaa/Documents/*.txt"
こうしたらcaseもifも不要でシンプルに出来ました
>>828
勉強になります。ありがとうございます
2020/03/10(火) 10:13:09.27ID:KDNpqv0e
>>828
なんでそんなにifにこだわるんだろうかね

if [ "${filepath##*.}" = "txt" ]; then
case $filepath in *.txt)
if [[ $filepath = *.txt ]]; then

どれがシンプルかは比べてみれば明らかだろうに

caseはcase一つで実現しているが、ifは別途 [ または [[ を
組み合わせてるから無駄な処理を行ってるんだが
文字数も長いし、[[はbash依存

パターンマッチングをcaseからifに置き換えても
文字を長くして無駄な処理を行って動くシェルを減らしているだけで
メリットが一つもない
2020/03/10(火) 16:38:10.67ID:HVuW4BfF
一つだけなのにcaseを使うのが気持ち悪い、判断パターンをcaseの後に書くのが気持ち悪いという感性の問題だな
どの感性が良い悪いというのではく。コーディング規約が一つにならないのと同じような
お前は俺のコーディング規約が絶対と言って譲らないのと同じ
2020/03/10(火) 22:41:26.01ID:DGocRqod
コーディング規約と漠然にいってるけどその内容には二種類あって、
一つは「理由がある良いやり方」と
もう一つは「どちらでも良いけど統一しましょう」というだけのもの

理由があるものはどちらが良いか明確に言うことができる。
明確に言えないものはインデントのスペースを2にするか4にするかという
統一だけするもの。コーディング規約にはこの二つが混じっているから、
良いか悪いかの話ができるものまで、好みの話だと勘違いしてる。

感性が邪魔して良い方法を採用することが出来ないという気持ちはわかるが
今回は明らかにcaseを使ったほうが良い。他にifの方がいい理由があれば
トレードオフの話に持っていけるが
2020/03/11(水) 02:59:38.62ID:nI7VA1ob
しつこい
2020/03/11(水) 03:56:24.84ID:arwb9WsV
俺様が決めたコーディング規約に従えねぇってかごるぁ
ということを言いたいんだろうな。caseは正義なんだと。
2020/03/11(水) 04:45:38.32ID:ZeFz9OTM
承認欲求のひとつだろな
2020/03/11(水) 09:22:15.60ID:FWSDJbu9
>>834
コーディング規約の話なんかしてないだろ?
この場合は、caseの方が優れてるのに
ifを使いたいという"感性"を持ち出してきたアホが居るだけ
そのアホがコーディング規約がーとか意味不明なことを言ってるだけ
2020/03/11(水) 09:32:31.50ID:FWSDJbu9
この場合はcaseが優れてるね

case使えって言った!こいつどんなときでもcase使えって言った!
理由はコーディング規約だからそれに従えだって!


誰もそんなこと言ってないんだよなぁ(笑)
なんで優れてるかどうかの話をすり替えたんだろうね
2020/03/11(水) 09:35:24.46ID:arwb9WsV
>>836-837
>>833読んだ?
2020/03/11(水) 10:04:34.79ID:FWSDJbu9
>>838
自分がしつこいから、レスが来てるって思わない?w
2020/03/11(水) 10:35:05.80ID:9AoZOnAU
>>829を読むとcaseもifも使わないでシンプルに出来たと言っていて、本人はifになんか全然拘っていないんだよな。何故か勝手にしつこく敵視してる笑。
2020/03/11(水) 10:40:57.60ID:FWSDJbu9
敵視してるのは>>831だぞw
2020/03/11(水) 15:58:19.41ID:6PQL09wH
これがアスベというのだな
2020/03/11(水) 18:51:36.11ID:6kL2fYSe
無駄なcat的な何か
2020/03/14(土) 09:40:09.35ID:H7XbSJpX
知らんかったけど、こんな書き方できるんやな

cat << HERE |
abc
HERE
sed s/a/b/g

cat <<HERE &&
abc
HERE
echo abc

謎な書き方多すぎw
2020/03/14(土) 09:44:21.77ID:H7XbSJpX
cat <<HERE && cat<<HERE
aaa
HERE
bbb
HERE

わろたw
これも動くんだ
2020/03/14(土) 11:50:07.06ID:9+oeBXql
zshだとOKだけどbashだけど文法エラーになるものってあるかな?

例えばbashだとOKだけど、shでは文法エラーになるものに配列がある。

$ bash -cn 'a=()'
$ sh -cn 'a=()'
sh: 1: Syntax error: "(" unexpected

これのzsh版
2020/03/14(土) 11:52:32.93ID:9+oeBXql
ただしこれは除く

$ bash -cn 'foo() :'
bash: -c: 行 0: 予期しないトークン `:' 周辺に構文エラーがあります
bash: -c: 行 0: `foo() :'

これはshでは通る。POSIX準拠の構文なはず。だけどbashが通らない珍しい例
$ sh -cn 'foo() :'
848デフォルトの名無しさん
垢版 |
2020/03/14(土) 15:19:53.15ID:4q4RZYWz
環境はMac mojave、lsとecho $(ls)とで挙動が違うのってなんででしょうか
前者はスペースや改行がしっかりされてるんですが後者は整形されませんでした
2020/03/14(土) 15:51:10.82ID:ILPzjwAA
lsは出力先によってオプションを指定しない場合のdefault formatが変わる
そういう仕様
2020/03/14(土) 16:50:55.95ID:cW1wo+Y7
>>848
echoなんぞに引数で渡す場合は、引数として渡すために分割されてるからじゃね。逆に整形されてるとも言える
echo "$(ls)"
(IFS=''; echo $(ls))
だと同じくならなくね?
2020/03/14(土) 17:16:06.25ID:aw8SOrjK
>>848
echoは複数の引数を(IFSの値とは関係なく)
スペースで区切ってくっつけるという仕様だから
2020/03/14(土) 17:30:36.50ID:ILPzjwAA
$ echo "$(export COLUMNS=159; export CLICOLOR_FORCE=1; ls -C)"
これでlsだけの時と同じ出力になった
2020/03/14(土) 17:34:32.34ID:aw8SOrjK
それは一つの引数の中に改行があるからな

別の問題として最後に複数の改行があっても一つにまとまるから
厳密には同じではない
2020/03/14(土) 17:48:52.56ID:Qg6b8RMl
なにいってるの
2020/03/14(土) 17:52:54.94ID:aw8SOrjK
正しいことを言ってる
2020/03/14(土) 17:55:17.78ID:Qg6b8RMl
変わったやつなのはわかった
2020/03/14(土) 17:56:25.94ID:aw8SOrjK
教えてほしいなら、何を教えればいいか具体的に言おうねw
質問者のくせに
2020/03/14(土) 17:58:01.23ID:Qg6b8RMl
おかしなやつだったか
2020/03/14(土) 18:01:56.55ID:aw8SOrjK
まーた始まった
2020/03/14(土) 18:20:00.64ID:tUDMKnWI
お前がな
2020/03/14(土) 21:45:32.98ID:fgvgQcum
>>844
その仕様は Perl にも受け継がれてるよ。
2020/03/14(土) 23:56:32.86ID:9VuyfYoc
echo は、連続した空白を、1つにまとめる
2020/03/15(日) 00:05:16.78ID:7lggs81n
$ echo " foo bar " " baz qux"
__foo__bar_____baz__qux

空白まとまらないけど、なんの話をしてるの?
2020/03/15(日) 00:13:30.80ID:1+6iz56B
$ echo " foo bar " " baz qux"
_foo_bar___baz_qux

って事を言ってるんじゃないかな
2020/03/15(日) 00:16:12.28ID:1+6iz56B
あららw "_" をスペースに読み換えて頂戴

$ echo " foo bar "_____________" baz qux"
_foo_bar___baz_qux
2020/03/15(日) 01:09:56.98ID:7lggs81n
マジか!?
それechoとは関係ないよね
2020/03/15(日) 03:22:11.24ID:DhvkTO6y
やってるのはシェルだよな
2020/03/15(日) 09:50:54.32ID:4Gm4pJRZ
せっかく俺が、複数の引数をっていってんのに
2020/03/15(日) 10:12:42.77ID:IC7rc7YS
>>862はいつものRuby君だろ。相変わらずデタラメを垂れ流してるな。
2020/03/15(日) 12:24:19.50ID:ekOFLY9+
exprの正規表現関連の機能って便利だな。
恥かしながらPOSIXで定義されているとは思わず,
ずっとBash拡張だと思って利用を避けてきてたわw

sedだと変数の値に対しての操作が一発でできない(printf '%s' "$var"なんかを噛ませないといけない)
から、「変数に対して,指定した位置の文字を抜きだす」くらいの単純作業なら,
sedよりexprで処理した方がコマンドの個数も少なくなるし,よさげ。
2020/03/15(日) 13:45:49.67ID:4Gm4pJRZ
>>870
exprは外部コマンド、bashとは無関係
sedで変数もうさも、sedの代わりにexprも意味がわからない。
使い方が違うコマンド
2020/03/15(日) 17:46:54.09ID:ekOFLY9+
>>871
Bashとは無関係とはいっても
echoみたいにPOSIXでは「外部コマンド」とされてるけど
Bashでは組み込みコマンドで,かつ独自の拡張機能が備わっている。
みたいな場合も考えられる。
2020/03/15(日) 20:32:36.11ID:LgQopvr+
>>872
/bin/exprで使えばええ
2020/03/15(日) 21:16:13.77ID:ekOFLY9+
>>873
いや,別に「外部コマンドとしてのexprが使いたい」なんて言ってない。
2020/03/15(日) 21:39:15.64ID:UEcfE5Ac
伝わらなくてもどかしそうw
2020/03/15(日) 22:09:22.92ID:7377Zo4Z
>>872
exprがビルトインになってるシェルは存在しない
2020/03/15(日) 22:19:50.83ID:GTp/Qp/S
exprぐらいシェルのビルトインになっていてもおかしくない。ある意味思い込み
exprの正規表現関連はbashの拡張だと思っていた。exprがbashのビルトインしくはbashのオマケ外部コマンドなのが必須=完全な思い込み
というだけだろ。言いたいことはそこじゃないだろに、読み取ってやれよw
2020/03/15(日) 22:24:16.72ID:GTp/Qp/S
「Bash拡張」ではなく「GNU拡張」なんぞに置き換えればいいだけだな
2020/03/15(日) 22:30:33.87ID:7377Zo4Z
>>877
だからbashの拡張だと思っていたと言ってるから
そもそも外部コマンドだ。と言ってるだけなんだが
2020/03/15(日) 22:35:36.36ID:GTp/Qp/S
>>879
>>878

そこは蛇足
exprの正規表現関連はPOSIXじゃないと利用を避けてきたわ
で済むだけ。外部コマンドとか蛇足もいいとこな話だろう
2020/03/15(日) 22:42:53.24ID:7377Zo4Z
蛇足って話をするのなら、外部コマンドに反論すること自体が蛇足

そんなどうでもいいことじゃなくて、
sedでprintf '%s' "$var"とか言う意味不明な点を説明しろよ
変数の値に対しての操作が一発でできないのは「外部コマンド」ならどれも一緒だろ
2020/03/15(日) 22:48:02.29ID:GTp/Qp/S
思い込みの理由を述べただけと読んでやれよ。なんでそうも噛み付いているの?

sedにネタ元渡すためにはとかじゃないの?echoでもいいんじゃないの?ソコは
exprは対象を引数として渡せるぐらいの意味、動作及び返り値が単純だから変数をちょっとイジるくらいならsedよりもって話じゃないの。俺はそう読み取ったけど

なんでそうも強く噛み付いているの?
2020/03/15(日) 22:50:35.45ID:7377Zo4Z
> なんでそうも強く噛み付いているの?

噛み付いてないけど?俺はexprは外部コマンドと言っただけ
それ以外のことを言ってない。
過剰に反応してるのはお前では?
2020/03/15(日) 22:53:20.23ID:GTp/Qp/S
蛇足なことが続くなと思ったからだけど。蛇足な理由を言っただけだけど?
>>881なんて明らかに噛み付いているだろうにw 特に後半とか。よく言うよ
2020/03/15(日) 22:59:01.24ID:7377Zo4Z
後半?これ?蛇足(bash拡張かどうか)じゃなくて本筋の話をしろとしか書いてないが?

> sedでprintf '%s' "$var"とか言う意味不明な点を説明しろよ
> 変数の値に対しての操作が一発でできないのは「外部コマンド」ならどれも一緒だろ
2020/03/15(日) 23:07:40.57ID:9BnnGhWf
無茶苦茶だなとしか言いようがない
で、その応えは>>882で納得したのかね?合っているのか知らんけど、俺は一応そうは読めたからなあ、「意味不明な点を[説明しろよ]」とか何様なんだか何噛み付いているのかとしか思えない
2020/03/15(日) 23:29:41.29ID:ekOFLY9+
えぇ……なんでそうも喧嘩腰なんですかね……。
2020/03/15(日) 23:42:33.62ID:9BnnGhWf
わからん...性かなww
2020/03/15(日) 23:47:47.62ID:LgQopvr+
こんな所でしか他人に相手にして貰えないからでしょ?
2020/03/15(日) 23:50:43.81ID:9BnnGhWf
読めなさそうな人はそうかもねw
2020/03/15(日) 23:52:26.22ID:Uvpryj8C
>>870 を読んだ限りでは
「そうか、誤解してたのか。でもその誤解はもう解けたんだな。」
くらいにしか思わないけどなあ。
知らないみたいだから教えてやろうみたいな考えにはならないけどなあ。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況